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);
źródło
Odpowiedzi:
Oto kilka dodatkowych wskazówek na temat reguł testowania, które mogą ułatwić debugowanie użytkownikom na hostingu współdzielonym
1. Użyj agenta fałszywego użytkownika
Podczas testowania nowej reguły dodaj warunek, aby wykonać ją tylko z klientem
fake
użytkownika, którego będziesz używać dla swoich żądań. W ten sposób nie wpłynie to na nikogo w Twojej witrynie.na przykład
Jeśli używasz przeglądarki Firefox, możesz użyć przełącznika User Agent Switcher, aby utworzyć fałszywy ciąg agenta użytkownika i przetestować go.
2. Nie używaj 301, dopóki nie zakończysz testowania
Widziałem tak wiele postów, w których ludzie wciąż testują swoje reguły i używają 301. NIE .
Jeśli nie korzystasz z sugestii 1 na swojej stronie, nie tylko Ty, ale każdy odwiedzający Twoją witrynę w tym czasie będzie miał wpływ na 301.
Pamiętaj, że są trwałe i agresywnie buforowane w przeglądarce. Zamiast tego używaj 302, a następnie zmień na 301.
3. Pamiętaj, że 301 są agresywnie buforowane w przeglądarce
Jeśli twoja reguła nie działa i wygląda dobrze dla Ciebie, a nie korzystałeś z sugestii 1 i 2, to ponownie przetestuj po wyczyszczeniu pamięci podręcznej przeglądarki lub podczas prywatnego przeglądania.
4. Użyj narzędzia przechwytywania HTTP
Użyj narzędzia przechwytywania HTTP, takiego jak Fiddler, aby zobaczyć rzeczywisty ruch HTTP między przeglądarką a serwerem.
Podczas gdy inni mogą powiedzieć, że twój
site does not look right
, możesz zamiast tego to zobaczyć i zgłosićall of the images, css and js are returning 404 errors
, szybko zawężając problem.Podczas gdy inni poinformują cię
started at URL A and ended at URL C
, będziesz mógł zobaczyć, że zaczęli odURL A, were 302 redirected to URL B and 301 redirected to URL C
. Nawet jeśli URL C był ostatecznym celem, będziesz wiedział, że jest to niekorzystne dla SEO i wymaga naprawy.Będziesz mógł zobaczyć nagłówki pamięci podręcznej ustawione po stronie serwera, odtwarzać żądania, modyfikować nagłówki żądań w celu przetestowania ...
źródło
[L,R=302]
[L, R=302]
po prostu zrób[L,R]
domyślną wartość302
Testy przepisywania online .htaccess
Znalazłem ten Googling dla RegEx pomoc, to zaoszczędziło mi dużo czasu z konieczności przesłać nowe
.htaccess
pliki za każdym razem robię małą modyfikację.ze strony:
źródło
Nie zapominaj, że w plikach .htaccess jest to dopasowany względny adres URL.
W pliku .htaccess następująca reguła RewriteR nigdy nie będzie pasować:
źródło
/
, ale to usuwanie nie występuje w przypadku ciągów dopasowań zestawionych w poleceniach Rewrite Cond .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 działa zgodnie z Twoim zamierzeniem, korzystając z pełnego zakresu testowych identyfikatorów URI.
Zobacz regexpCheck.php poniżej, aby uzyskać prosty skrypt, który możesz dodać do katalogu prywatnego / testowego w swojej witrynie, aby to zrobić. Trzymałem to krótko, a nie ładnie. Wklej to do pliku
regexpCheck.php
w katalogu testowym, aby użyć go na swojej stronie. Pomoże to w utworzeniu wyrażenia regularnego i przetestowaniu go na liście przypadków testowych. Używam tutaj silnika PHP PCRE, ale po przyjrzeniu się źródłu Apache jest on zasadniczo identyczny z tym używanym w Apache. Istnieje wiele poradników i samouczków, które zawierają szablony i mogą pomóc Ci rozwinąć umiejętności wyrażania regularnego.Listing 1 - regexpCheck.php
źródło
import_request_variables
został wycofany w PHP 5.3 i usunięty w 5.4.extract($_GET)
w połączeniu zextract($_POST)
może wykonywać tę samą funkcję, ale wszystkie zmienne wymagałyby usunięcia prefiksu z ich nazwy. Źródło: php.net/manual/en/function.import-request-variables.phpUpewnij się, że używasz znaku procentu przed zmiennymi, a nie znaku dolara.
To
%{HTTP_HOST}
, nie${HTTP_HOST}
. W dzienniku błędów nie będzie nic, nie będzie żadnych wewnętrznych błędów serwera, wyrażenie regularne nadal jest poprawne, reguła po prostu się nie zgadza. Jest to naprawdę ohydne, jeśli często pracujesz z szablonami django / genshi i masz${}
zmienne podstawianie w pamięci mięśni.źródło
Jeden z kilku godzin, które zmarnowałem:
Jeśli zastosowałeś wszystkie te wskazówki i napotykasz tylko 500 błędów, ponieważ nie masz dostępu do dziennika błędów serwera, być może problem nie dotyczy pliku .htaccess, ale plików, do których przekierowuje.
Po naprawieniu problemu z .htaccess spędziłem dwie godziny, próbując go naprawić, chociaż po prostu zapomniałem o niektórych uprawnieniach.
źródło
.htaccess
problemy.Ustaw zmienne środowiskowe i użyj nagłówków, aby je otrzymać:
Możesz tworzyć nowe zmienne środowiskowe za pomocą wierszy RewriteRule, jak wspomniano w OP:
Ale jeśli nie możesz uruchomić skryptu po stronie serwera, jak możesz odczytać tę zmienną środowiskową? Jednym z rozwiązań jest ustawienie nagłówka:
Wartość akceptuje specyfikatory formatu , w tym
%{NAME}e
specyfikator zmiennych środowiskowych (nie zapomnij o małych literach e). Czasami musisz dodaćREDIRECT_
prefiks, ale nie opracowałem, kiedy prefiks zostanie dodany, a kiedy nie.źródło
REDIRECT_
prefiksu, czy nie ? Widzę także terminologię dotyczącą prefiksów w innych kontekstach (htaccess), ale nigdy nie było jasne, co dokładnie oznacza. Czy to oznacza, że musisz nazwać swoją zmienną prefiksem, czy dodać prefiks do nazwanej zmiennej, gdy używasz niektórych poleceń (ale nie innych poleceń)? Twój przykład jest pierwszym, który pokazuje zarówno definicję var, jak i użycie var, więc od tego jestem skłonny myśleć o tym drugim! Dokumenty niewiele pomogły - zakładają, że wiemy za dużo i podają za mało referencji / linków.Jeśli tworzysz przekierowania, przetestuj zwijanie, aby uniknąć problemów z buforowaniem przeglądarki. Użyj -I, aby pobrać tylko nagłówki http. Użyj -L, aby śledzić wszystkie przekierowania.
źródło
Znalazłem to pytanie, próbując debugować moje problemy z mod_rewrite, i na pewno zawiera kilka przydatnych porad. Ale w końcu najważniejsze jest upewnienie się, że masz poprawną składnię wyrażeń regularnych. Z powodu problemów z moją własną składnią RE instalowanie skryptu regexpCheck.php nie było wykonalną opcją.
Ale ponieważ Apache używa wyrażeń regularnych kompatybilnych z Perlem (PCRE), każde narzędzie, które pomaga pisać PCRE, powinno pomóc. W przeszłości korzystałem z narzędzia RegexPlanet w środowisku Java i JavaScript RE i cieszyłem się, że obsługują one również Perla.
Po prostu wpisz wyrażenie regularne i co najmniej jeden przykładowy adres URL, a dowiesz się, czy wyrażenie regularne pasuje („1” w kolumnie „~ =”) i, jeśli ma to zastosowanie, dowolne pasujące grupy (liczby w „podziale” kolumna będzie odpowiadać liczbom, których oczekuje Apache, np. 1 USD, 2 USD itp.) dla każdego adresu URL. Twierdzą, że obsługa PCRE jest „w wersji beta”, ale właśnie tego potrzebowałem, aby rozwiązać problemy ze składnią.
http://www.regexplanet.com/advanced/perl/index.html
Po prostu dodałbym komentarz do istniejącej odpowiedzi, ale moja reputacja nie jest jeszcze na tym poziomie. Mam nadzieję, że to komuś pomoże.
źródło
W odniesieniu do 4. nadal musisz upewnić się, że „sztuczny skrót skryptowy” jest faktycznie docelowym adresem URL po zakończeniu całego przepisywania, w przeciwnym razie nic nie zobaczysz!
Podobną / pokrewną sztuczką (patrz to pytanie ) jest wstawienie tymczasowej reguły, takiej jak:
Gdzie
show.php
jest bardzo prosty skrypt, który wyświetla tylko jego$_GET
parametry (możesz także wyświetlić zmienne środowiskowe, jeśli chcesz).Spowoduje to zatrzymanie przepisywania w miejscu, w którym wstawisz go do zestawu reguł, raczej jak punkt przerwania w debuggerze.
Jeśli używasz Apache <2.3.9, będziesz musiał użyć
[L]
zamiast[END]
, a następnie może być konieczne dodanie:Na samej górze zestawu reguł, jeśli sam adres URL
/show.php
jest przepisywany.źródło
Niektóre błędy, które zaobserwowałem, zdarzają się podczas pisania
.htaccess
Używanie
^(.*)$
powtarzające się w wielu regułach, używanie^(.*)$
powoduje , że inne reguły są w większości przypadków bezsilne, ponieważ dopasowuje cały adres URL w jednym trafieniu.Tak więc, jeśli używamy reguły dla tego adresu URL
sapmle/url
, zostanie on również wykorzystanysapmle/url/string
.[L]
należy użyć flagi, aby upewnić się, że nasza reguła zakończyła przetwarzanie.Powinien wiedzieć o:
Różnica w% ni $ n
%n
jest dopasowany podczas%{RewriteCond}
części i$n
to mecze na%{RewriteRule}
części.Działanie RewriteBase
źródło
Jeśli planujesz napisać więcej niż jedną linię reguł w .htacesss,
nawet nie myśl o wypróbowaniu jednej z tych metod poprawki w celu jej debugowania.
Zmarnowałem dni na ustawianie wielu reguł, bez informacji zwrotnych od LOG, tylko po to, żeby się poddać.
Mam Apache na komputerze, skopiowałem całą witrynę na dysk twardy i cały zestaw reguł uporządkowałem, używając dzienników, naprawdę szybko.
Następnie przejrzałem moje stare zasady, które działały. Widziałem, że tak naprawdę nie robili tego, co było pożądane. Bomba zegarowa, pod nieco innym adresem.
W przepisach przepisywania jest tak dużo upadków, że to wcale nie jest prosta logika.
Możesz uruchomić Apache w dziesięć minut, to 10 MB, dobra licencja, gotowość * NIX / WIN / MAC, nawet bez instalacji.
Sprawdź także wiersze nagłówka swojego serwera i pobierz tę samą wersję Apache z ich archiwum, jeśli jest stara. Mój OP jest nadal w wersji 2.0; wiele rzeczy nie jest obsługiwanych.
źródło
mod_rewrite
reguł debugowania , ale otwarcie „nawet o tym nie myśl” to po prostu zła rada dla podstawowych użytkowników usług wspólnych, którzy starają się zrozumieć, dlaczego ichhtaccess
pliki nie są t działają tak, jak powinny..htaccess
plików”, to jest to bardziej zrównoważone. Tak, konfiguracja lokalnej usługi Apache jest dość łatwa, ale jej odzwierciedlenie we wspólnej usłudze hostingowej dostawcy usług może być skomplikowane i wykraczać poza poziom umiejętności wielu użytkowników, którzy mogli skorzystać z konfiguracji Wordpress za jednym kliknięciem, powiedz i masz problemy z.htaccess
plikiem.Zostawię to tutaj, być może oczywisty szczegół, ale zmusiłem mnie do uderzania głową przez wiele godzin: używaj ostrożnie,
%{REQUEST_URI}
ponieważ to, co powiedział @Krist van Besien w swojej odpowiedzi, jest całkowicie poprawne, ale nie dla ciągu REQUEST_URI , ponieważ wyjście z tego TestString zaczyna się od/
. Uważaj więc:źródło
(Podobne do pomysłu Doin) Aby pokazać, co jest dopasowane, używam tego kodu
Zapisz go w pliku r.php w katalogu głównym serwera, a następnie wykonaj testy w .htaccess.
Na przykład chcę dopasować adresy URL, które nie zaczynają się od prefiksu języka
źródło
QUERY_STRING
jak wskazał @JCastell, tester online wykonuje dobrą robotę, testując poszczególne przekierowania na pliku .htaccess. Jednak bardziej interesujące jest udostępnienie interfejsu API, którego można użyć do testowania wsadowego listy adresów URL przy użyciu obiektu json. Jednak, aby uczynić go bardziej użytecznym, napisałem mały plik skryptu bash, który wykorzystuje curl i jq do przesłania listy adresów URL i parsowania odpowiedzi json w formacie CSV z numerem wiersza i regułą dopasowaną w pliku htaccess wraz z przekierowanym adresem URL, dzięki czemu bardzo przydatne jest porównanie listy adresów URL w arkuszu kalkulacyjnym i szybkie ustalenie, które reguły nie działają.
źródło
Jeśli pracujesz z adresem URL, możesz chcieć sprawdzić, czy „Enable Mod Rewrite”
źródło