2012-11-13 9 views
17

Konfiguruję reguły przepisywania Apache, aby uporządkować moje adresy URL CodeIgniter.

This question (i wiele postów itp że znalazłem wokół miejsca) udokumentować wykorzystanie następującej zasady (lub coś bardzo podobnego):

RewriteEngine on 
RewriteCond $1 !^(index\.php|phpinfo\.php|images|robots\.txt|sitemap\.xml\.gz|sitemap\.xml|assets) 
RewriteRule ^(.*)$ /index.php/$1 [L] 

wiem $ 1 po odsyła RewriteRule do przechwyconego ciągu od (. *), ale co oznacza pierwszy 1 $ (bezpośrednio po RewriteCond)? Wiele przykładów, które widziałem, używa czegoś podobnego do% {REQUEST_URI} jako pierwszego argumentu dla RewriteCond.

Odpowiedz

17

Jest to w zasadzie przechwycona zawartość wszystkiego od początku i końca napisu. Innymi słowy, $1 = (.*).

W swojej przepisanie The ^ oznacza początek napisu, (.*) mówi pasujące do niczego, a $ oznacza koniec łańcucha. Mówiąc ogólnie, chodzi o pobranie wszystkiego od początku do końca łańcucha i przypisanie tej wartości do 1 $.

Więc jeśli wpiszę www.example.com/tacos-are-good, to $1 = "tacos-are-good". Tak więc Twój przepisany koniec będzie w rzeczywistości www.example.com/index.php/tacos-are-good.

Oto ściągawki dla ModRewrite, które mogą być pomocne: http://www.addedbytes.com/cheat-sheets/mod_rewrite-cheat-sheet/

+2

Więc obie instancje $ 1 odnoszą się do tej samej wartości wtedy? –

+1

Tak. W "RewriteCond", w zasadzie mówi on, że uruchomi przepisanie tak długo, jak $ 1 nie będzie równe plikom wymienionym po prawej stronie warunku. – sbeliv01

6

1 USD oznacza dopasowanie z pierwszego zestawu nawiasów w wyrażeniu regularnym, które następuje po nim. (2 $ pasowałoby do drugiego zestawu nawiasów - jeśli podano)

Na przykład wyrażenie regularne pasuje do wszystkiego, co NIE jest "index.php" lub "phpinfo.php", itp. Tak więc warunek przepisywania jest przekazywany, jeśli Żądany URL nie jest jednym z nich, a dopasowana sekcja jest następnie przekazywana do przepisywania.