. Htaccess ve $ _GET yeniden yazma

3 Cevap php

Ben rahatsız edici bir sorun yaşıyorum. Ben sayfanın url bir değişkeni almak için php $ _GET özelliğini kullanan bir komut dosyası var. Ancak, ben, her şeyden önce, benim sayfa url gitmek yapmak için bilmek gerekir

http://www.example.com/dir/dir2/page.php?value=something&anothervalue=somethingelse

karşı

http://www.example.com/something/dir2/somethingelse/page.php

Bu benim için kafa karıştırıcı.

Now, here is the tough part: How do I $_GET the values of value and anothervalue while leaving any other url values intact at the end of page.php? Also, if a user visits http://www.example.com/something/dir2/somethingelse/page.php they will be shown the content for http://www.example.com/dir/dir2/page.php?value=something&anothervalue=somethingelse, and vice versa, right?

This is very important karşıthe operation of my site, thanks for helping in advance! I don't know anything about .htaccess at all but I do know that it is possible karşıdo this.

Çok daha az recoding gerektirir ve temiz URL'LER sağlayacak bu çok kafa karıştırıcı bir şey aslında uzun vadede işler daha basit hale getirecek yapıyor, açıklığa kavuşturmak için.

3 Cevap

Bu kural yapmalı:

RewriteCond %{REQUEST_URI} !^/dir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/(.*) dir/$2/$4?value=$1&anothervalue=$3 [L,QSA]

Bu /something/dir2/somethingelse/page.php içten /dir/dir2/page.php?value=something&anothervalue=somethingelse için isteklerini yeniden.

Ama bu doğrudan ikincisi isteyen ama sadece bir takma ad izin engellemek olmaz.

/dir/dir2/page.php?value=something&anothervalue=somethingelse dıştan isteklerini yönlendiriliyor /something/dir2/somethingelse/page.php de mod_rewrite ile mümkündür ancak URL parametreleri keyfi bir düzen var çünkü biraz daha karmaşık kuralı gerektirir:

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)value=([^&]+)&?([^&].*)?$
RewriteCond %3&%1%4 ^([^&]+)&(([^&]*&)*)anothervalue=([^&]+)&?([^&].*)?$
RewriteRule ^dir/([^/]+)/(.*) /%1/$1/%4/$2?%2%5 [L,R=301]

Gördüğünüz gibi, bu gerçekten hoş değil. Daha iyi bir çözüm ne URL () and do the redirect with PHP (see header function $_SERVER['REQUEST_URI'] bakınız) talep edilmiştir PHP ile kontrol etmek olacaktır.

Haklısın, bunu yapmak mümkündür. Diğerleri katılmıyorum, ama konum noktasında uygun bir şey the documentation for mod_rewrite başvurmak için olduğunu düşünüyorum eğilimindedir. Eğer yeniden yazar bir dizi bu karmaşık korumak için gidiyoruz eğer, er ya da geç bunu öğrenmek için ihtiyacımız olacak, bu yüzden de şimdi olabilir.

Eğer yukarıdaki poz belirli yeniden yazmak için, böyle bir şey çalışması gerekir:

RewriteEngine On
RewriteRule ^/(.*)/(.*)/(.*)/(.*)\.php$ /dir/\2/\4.php?value=\1&anothervalue=\3 [L]

... Bu onlara ekstra düzeyleri ile yolları maç ve yeniden yazma vida gibi pratikte ben, belirteç olarak gösterilen nokta kullanarak tavsiye etmem. Ben bir göz atın ve orada da herhangi bir tuzaklar var olup olmadığını belirlemek için benden regexes daha iyi birini istiyorum her ne kadar her nokta değiştirilmesi [^/], işe yarayabilir. Neyse, önemli olan düzenli ifadeler çok karmaşık hem de çok güçlü olabilir ki, bunların tam bir açıklama yolu, bu cevabın kapsamı dışındadır. Genel eğitim için http://www.regular-expressions.info bazı vakit sahipsiniz.

Ayrıca, bir kullanıcının ziyaret http://www.example.com/something/dir2/somethingelse/page.php onlar http://www.example.com/dir/dir2/page.php?value=something&anothervalue=somethingelse için içerik ve tersi, sağ gösterilir edilecektir?

No; sadece bir şekilde çalışır. Eğer iki RewriteRules gerekir hem de yollar yapmak.

Ben sorunuzu yaklaşık $ _GET anlamak emin değilim. $ _GET URL parametrelerin her biri için anahtar / değer çiftleri ile dolu bir dizidir; gibi birçok veya istediğiniz gibi onları olabildiğince az kullanabilirsiniz. Bu yıkıcı değil - bunu kullanarak URL dize parametreleri değiştirmez.