Jak debugować Apache mod_rewrite

171

Mam dwa główne problemy z mod_rewrite:

1) Nie jest zgłaszany żaden znaczący błąd, gdy mam nieprawidłową regułę

wprowadź opis obrazu tutaj

2) Aby rzetelnie przetestować każdą modyfikację, muszę wyczyścić pamięć podręczną Chrome. To nie jest fizyka jądrowa, ale muszę nacisnąć Ctrl + Shift + Delete, a następnie kliknąć OK, a następnie zamknąć okno i załadować ponownie.

Chciałbym zobaczyć, czy któryś z guru jest skłonny podzielić się swoimi sekretami, aby efektywnie zarządzać kodem mod_rewrite.

rzygać
źródło
1
Puk, zobacz stackoverflow.com/questions/9153262/ ... gdzie omawiam niektóre ze standardowych sztuczek.
TerryE
możliwy duplikat How to debug htaccess rewrite script
użytkownik

Odpowiedzi:

283

Jedna sztuczka polega na włączeniu dziennika przepisywania. Aby go włączyć, wypróbuj te linie w głównej konfiguracji Apache lub w bieżącym pliku wirtualnego hosta ( nie w .htaccess):

RewriteEngine On
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

Od czasu Apache httpd 2.4 mod_rewrite dyrektywy RewriteLog i RewriteLogLevel zostały całkowicie zastąpione przez nową konfigurację rejestrowania na moduł.

LogLevel alert rewrite:trace6
Ben
źródło
81
Nie możesz tego umieścić w .htaccess. Musisz to umieścić w konfiguracji VirtualHost.
Attila Szeremi
7
Musisz RewriteEngine Ontam również mieć sekcję, ponieważ jeśli tylko ją włączysz (tak jak ja) w .htaccesspliku, nic nie zostanie zarejestrowane.
chacham15
12
gdzie znajduje się plik dziennika w Apache 2.4?
Charles John Thompson III
4
Elementy dziennika 2.4 znajdziesz w odpowiednim dzienniku błędów. Może to zależeć od twojej konfiguracji, ale domyślne ustawienia Debiana / Ubuntu mają je w /var/log/apache2/error.log
Josiah
10
Wskazówka dla profesjonalistów: pamiętaj, aby wyłączyć wylogowywanie przepisywania. Jeśli zapomnisz, dość szybko zapełnisz dysk twardy, zwłaszcza na serwerze produkcyjnym.
John Hunt
132

Dyrektywa LogRewrite, o której wspomniał Ben, nie jest już dostępna w Apache 2.4. Zamiast tego musisz użyć dyrektywy LogLevel. Na przykład

LogLevel alert rewrite:trace6

Zobacz http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#logging

Tobias Schultze
źródło
22
gdzie jest powiązany z tym plik dziennika?
Charles John Thompson III
8
@CharlesJohnThompsonIII - plik dziennika to dziennik błędów (określony przez dyrektywę ErrorLog). W przypadku dokumentów możesz uzyskać tylko przepisane wiadomości za pomocą tail -f error_log|fgrep '[rewrite:'
grepa
1
nie zapomnij zrestartować Apache
Accountant م
1
Musiałem się upewnić, że AllowOverridezostał ustawiony All!
Michael
25

Aby przeprowadzić podstawowe rozpoznawanie adresów URL, użyj narzędzia pobierania wiersza poleceń, takiego jak wgetlub, curlaby przeprowadzić test, zamiast ręcznej przeglądarki. Wtedy nie musisz czyścić pamięci podręcznej; po prostu strzałka w górę i Enter w powłoce, aby ponownie uruchomić pobieranie testów.

Kaz
źródło
14
Inną sztuczką jest użycie „trybu porno” Chrome (Ctl + Shift + N). Po zamknięciu okna wszystkie buforowane konteksty sesji są usuwane.
TerryE
Myślę, że przeglądanie "sesji prywatnej" Firefoksa również. Ale czy mówisz, że ten kontekst dotyczy pojedynczego okna (więc nie zamykasz Chrome?)
Kaz
2
AFAIK, Chrome i Ff różnią się tym, że Ff działa jako pojedynczy proces, który jest w trybie prywatnym lub nie. W przeglądarce Chrome każda karta lub okno działa jako oddzielny proces i może być indywidualnie w trybie prywatnym; zamknij prywatne okno / kartę, a jego kontekst zostanie usunięty.
TerryE
1
Dodatek PrivateTab do FF robi to. Każda zakładka działa indywidualnie.
Javid
Ta metoda pokazuje również przekierowania! Fajnie dla kogoś, kto nie ma dostępu do pliku konfiguracyjnego apache maszyny.
Geof Sawaya
14

Jest tester htaccess .

Pokazuje, które warunki zostały przetestowane dla określonego adresu URL, które spełniły kryteria i które reguły zostały wykonane.

Wygląda jednak na to, że ma pewne usterki.

Andy
źródło
2
Dla mnie to pokazało zieloną wykonaną regułę w ostatniej linii bez żadnego kodu.
Andy
@thombr, czy możesz być bardziej precyzyjny? Link nie działa? Albo narzędzie? Co dokładnie nie działa? Dlaczego jest to istotne w kontekście tego pytania?
Andy,
1
To mówi mi, że adres URL jest przekształcany zgodnie z oczekiwaniami ... jednak na rzeczywistym serwerze otrzymuję 404
Michael
@michael czy testowana reguła jest jedyną obecną w Twojej konfiguracji? Czy mod_rewrite jest faktycznie zainstalowany i aktywny?
Andy
Okazuje się, że zastąpienia nie były włączone
Michael
3

Opierając się na odpowiedzi Bena, możesz wykonać następujące czynności, uruchamiając apache w systemie Linux (w moim przypadku Debian).

Najpierw utwórz plik rewrite-log.load

/etc/apache2/mods-availabe/rewrite-log.load

RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

Następnie wejdź

$ a2enmod rewrite-log

śledzony przez

$ service apache2 restart

A kiedy zakończysz debugowanie reguł przepisywania

$ a2dismod rewrite-log && service apache2 restart

Pływ
źródło
To nie zadziałało. Otrzymuję sandino @ envy: ~ $ sudo usługa apache2 restart * Restartowanie serwera WWW apache2 [niepowodzenie] * Test konfiguracji apache2 nie powiódł się. Wynik testu konfiguracji był następujący: AH00526: Błąd składni w linii 1 w /etc/apache2/mods-enabled/rewrite-log.load: Niepoprawne polecenie „RewriteLog”, prawdopodobnie błędnie napisane lub zdefiniowane przez moduł nieuwzględniony w konfiguracji serwera
sandino
3
@sandino, jakiej wersji Apache używasz? Wygląda na to, że ta składnia została zmieniona na 2.4, użyj zamiast tego: LogLevel warn rewrite:trace8lub LogLevel info rewrite:trace8gdzie 8 może być dowolną liczbą z zakresu 1-8
szalony