Wiele plakatów ma problemy z debugowaniem instrukcji RewriteRule i RewriteCond w swoich .htaccess
plikach. Większość z nich korzysta ze wspólnej usługi hostingowej i dlatego nie ma dostępu do konfiguracji serwera głównego. Nie mogą uniknąć używania .htaccess
plików do przepisywania i nie mogą włączyć RewriteLogLevel ", jak sugeruje wielu respondentów. Istnieje również wiele .htaccess
specyficznych pułapek i ograniczenia nie są dobrze uwzględnione. Konfigurowanie lokalnego testowego stosu LAMP wymaga zbyt dużej krzywej uczenia się dla większości .
Więc moje pytanie tutaj polega na tym, jak zalecamy samodzielne debugowanie reguł . Poniżej podaję kilka sugestii. Inne sugestie będą mile widziane.
Zrozum, że silnik mod_rewrite zmienia
.htaccess
pliki . Silnik działa w tej pętli:do execute server and vhost rewrites (in the Apache Virtual Host Config) find the lowest "Per Dir" .htaccess file on the file path with rewrites enabled if found(.htaccess) execute .htaccess rewrites (in the user's directory) while rewrite occurred
Twoje reguły będą wykonywane wielokrotnie, a jeśli zmienisz ścieżkę URI, może to spowodować wykonanie innych
.htaccess
plików, jeśli istnieją. Upewnij się, że zakończysz tę pętlę, jeśli to konieczne, dodając dodatkowe,RewriteCond
aby zatrzymać uruchamianie reguł. Usuń także wszystkie.htaccess
zestawy reguł przepisywania niższego poziomu, chyba że wyraźnie zamierzasz używać zestawów reguł wielopoziomowych.Upewnij się, że składnia każdego Regexp jest poprawna , testując zestaw wzorców testowych, aby upewnić się, że jest to poprawna składnia i robi to, co zamierzasz z pełnym zakresem testowych identyfikatorów URI. Zobacz odpowiedź poniżej, aby uzyskać więcej informacji.
Twórz swoje reguły stopniowo w katalogu testowym. Możesz skorzystać z opcji „wykonaj najgłębszy
.htaccess
plik na ścieżce”, aby skonfigurować osobny katalog testowy (drzewo) i debugować tutaj zestawy reguł bez zepsucia głównych zasad i zatrzymania działania witryny. Musisz je dodawać pojedynczo, ponieważ jest to jedyny sposób zlokalizowania awarii poszczególnych reguł.Użyj fałszywego kodu pośredniczącego do zrzucenia zmiennych serwera i środowiska . (Patrz Listing 2 ) Jeśli Twoja aplikacja używa, powiedzmy,
blog/index.php
możesz to skopiowaćtest/blog/index.php
i użyć do przetestowania swoich reguł blogów wtest
podkatalogu. Możesz także użyć zmiennych środowiskowych, aby upewnić się, że silnik przepisywania poprawnie interpretuje ciągi podstawień, npRewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]
i poszukaj tych zmiennych REDIRECT_ * w zrzutu phpinfo. BTW, użyłem tego i odkryłem na mojej stronie, że musiałem
%{ENV:DOCUMENT_ROOT_REAL}
zamiast tego użyć . W przypadku zapętlenia readresatora zmienne REDIRECT_REDIRECT_ * wyświetlają poprzednie przejście. Itp..Upewnij się, że przeglądarka nie ugryzie Cię w buforowaniu niepoprawnych przekierowań 301 . Zobacz odpowiedź poniżej . Dziękuję za to Ulrichowi Palha .
Mechanizm przepisywania wydaje się wrażliwy na kaskadowe reguły w
.htaccess
kontekście (czyli tam, gdzieRewriteRule
skutkuje to podstawieniem, a to sprowadza się do dalszych reguł), ponieważ znalazłem błędy w wewnętrznych żądaniach podrzędnych (1) i nieprawidłowe przetwarzanie PATH_INFO, które często zapobiega się za pomocą flag [NS], [L] i [PT].
Więcej komentarzy lub sugestii?
Listing 1 - phpinfo
<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);