Najpierw powiem wam jak czytać RewriteRule:
zacząć od pierwszego (lub następny) Wpisz RewriteRule:
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
Pierwszy parametr jest wyrażeniem regularnym, które może odpowiadać żądanemu adresowi URL. ^(.*)$
dopasowuje wszystko i przechowuje to "wszystko" wewnątrz zmiennej, której można użyć później.
Tylko jeśli nie są poprzedzający wpisów RewriteCond i wyceniane są następne:
RewriteCond $1 !^(index\.php|resources|robots\.txt)
$1
jest odniesienie się do treści dopasowane do wnętrza pierwszych nawiasach RewriteRule. Jest to porównywane z drugim parametrem, który jest wyrażeniem regularnym zawierającym kilka nazw jawnych, a !
neguje wyrażenie, np. ta reguła pozwala na wykonanie RewriteRule tylko wtedy, gdy wyrażenie regularne nie pasuje. Jeśli ten warunek zwróci wartość true, zostanie przeanalizowany następny warunek.
RewriteCond %{REQUEST_FILENAME} !-f
Jeśli żądana nazwa pliku ma prawdziwego plik na twardym dysku, ten warunek jest spełniony.
RewriteCond %{REQUEST_FILENAME} !-d
Jeśli żądana nazwa pliku nie jest prawdziwy katalog ten warunek jest spełniony.
Tylko jeśli wszystkie te warunki są spełnione (są przykuci wraz z I), wracamy do reguły przepisywania:
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
Efektem tego etapu przepisywania jest definiowany jako drugi i trzeci parametr. $1
jest używany ponownie tak samo, jak z treścią dopasowania, a parametry definiują, że ta reguła, jeśli jest początkowo dopasowana, będzie ostatnią (L) regułą, i że dowolny ciąg zapytania zdefiniowany w docelowym przeprogramowaniu zostanie dołączony do dowolnego ciągu zapytania w oryginalnym adresie URL (QSA).
Krytyka:
Zazwyczaj przepisywanie dla ram MVC starają się być tak wydajnych jak to możliwe. Wszystkie warunki przepisywania muszą zostać ocenione pod kątem pomyślnego przepisania. Zatrzymanie nastąpi tylko wtedy, gdy którykolwiek z ReRriteCond zwróci false. Każde żądanie, które zostanie przepisane, podlega wielu intensywnym testom cpu. Najpierw regex RewriteRule, a następnie regex w pierwszym RewriteCond, a następnie dwa testy harddisk w systemie plików dla pliku existing.
Z drugiej strony pierwszy RewriteCond wydaje się niepotrzebny. Testuje pewne nazwy i jeśli zostanie znalezione, przerwie przepisywanie. "index.php" powinien zostać wykryty przez drugi RewriteCond, ponieważ jest to istniejący plik (jak by to było, gdyby nie było przepisywania). Wszystko, co zaczyna się od "zasobów" będzie również dopasowane, ale prawdopodobnie nie powinno z tych samych powodów: Istniejące zasoby zostaną znalezione przez drugi RewriteCond. Ostatni plik "robots.txt". Dobrym pomysłem jest posiadanie jednego z nich, jeśli to możliwe, aby uniknąć 404, gdy roboty pobierają twoją witrynę.
Ponieważ nic nie zmieniasz w ciągu zapytania, dyrektywa [QSA] nie jest potrzebna.
ulepszenia:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [L]
RewriteRule ^.*$ index.php [L]
Pierwszy RewriteRule będzie pasował do całej żądanej trasy. Dwa RewriteCond są połączone z [LUB], więc pierwszy RewriteCond, który zwraca wartość true, anuluje dalszą ocenę. Pierwsze testy RewriteCond, jeśli żądany plik istnieje. Jeśli istnieje, zwraca wartość true, a przetwarzanie powraca do pierwszej reguły RewriteRule. Wyrażenie docelowe to "-", co oznacza "nie przepisuj". [L] przerywa dalsze przetwarzanie reguł przepisywania. Ostatecznie dla istniejącego pliku mamy tylko jeden test regex i jeden system plików, a następnie istniejący plik zostanie wysłany do przeglądarki.
Jeśli nie znaleziono pliku, pierwsze RewriteRule i RewriteCond nie zostaną uruchomione, więc [L] nie zatrzyma procesu. Tak więc jest wykonywana druga RewriteRule. Ten jest bezwarunkowy, a wyrażenie regularne jest takie samo jak poprzednio, pasuje do wszystkiego i przepisuje je na "index.php".
To przepisanie nie wywoła indeksu.php, jeśli istnieje jakikolwiek plik, w tym /forum/login.php.
Możesz zmienić sekundę na RewriteRule ^.*$ index.php/$0 [L]
, jeśli chcesz kontynuować przetwarzanie $_SERVER['PATH_INFO']
zamiast $_SERVER['REQUEST_URI']
.
Dziękujemy! Od miesięcy szukam tego poziomu wyjaśnień. – wallyk
Poprawka działa teraz. –
To jest tak niewiarygodnie dokładne i potrzebuje WAY więcej kredytu, niż zostało mu dane. –