Jak debugować .htaccess RewriteRule nie działa

115

Mam RewriteRulew .htaccesspliku, który nic nie robi. Jak mogę rozwiązać ten problem?

  • Jak mogę sprawdzić, czy .htaccessplik jest w ogóle odczytywany i przestrzegany przez Apache? Czy mogę napisać komunikat echa „to działa”, jeśli to napiszę, gdzie ta linia zostanie odtworzona?
  • Jeśli .htaccessplik nie jest używany, jak mogę sprawić, by Apache go użył?
  • Jeśli .htaccessjest używany, ale mój RewriteRulenadal nie działa, co więcej mogę zrobić, aby debugować?
macha
źródło

Odpowiedzi:

144

Podać wartość śmieci do swojego .htaccess np foo bar, sakjnaskljdnas dowolne słowo kluczowe nie uznawane przez htaccess i odwiedzić adres URL. Jeśli to działa, powinieneś otrzymać plik

500 wewnętrzny błąd serwera

Wewnętrzny błąd serwera

Serwer napotkał błąd wewnętrzny lub błędną konfigurację i nie mógł zrealizować Twojego żądania ....

Sugeruję, abyś to wstawił wkrótce RewriteEngine on.


Ponieważ jesteś na swoim komputerze. Zakładam, że masz dostęp do .confpliku Apache .

otwórz .confplik i poszukaj linii podobnej do:

LoadModule rewrite_module modules/mod_rewrite.so

Jeśli jest skomentowany (#), odkomentuj i zrestartuj apache.


Aby zalogować przepisać

RewriteEngine On
RewriteLog "/path/to/rewrite.log"
RewriteLogLevel 9

Umieść powyższe 3 linie w swoim virtualhost. zrestartuj httpd.

RewriteLogLevel 9Użycie wysokiej wartości poziomu znacznie spowolni twój serwer Apache! Użyj przepisanego pliku dziennika na poziomie wyższym niż 2 tylko do debugowania! Poziom 9 będzie rejestrował prawie każdy szczegół dziennika zmian.


AKTUALIZACJA

W Apache 2.4 sytuacja się zmieniła:

OD Aktualizacja do 2.4 z 2.2

Dyrektywy RewriteLog i RewriteLogLevel zostały usunięte. Ta funkcjonalność jest teraz zapewniana przez skonfigurowanie odpowiedniego poziomu rejestrowania dla modułu mod_rewrite przy użyciu dyrektywy LogLevel . Zobacz także sekcję logowania mod_rewrite.

Aby uzyskać więcej informacji na temat LogLevel, zapoznaj się z dyrektywą LogLevel

możesz osiągnąć

RewriteLog "/path/to/rewrite.log"

w ten sposób teraz

LogLevel debug rewrite_module:debug
ThinkingMonkey
źródło
Ok, problem polega na tym, że próbuję dodać przepisywanie do pliku .htaccess iz jakiegoś powodu go nie używa.
macha
@macha wypróbuj powyższą metodę. Jeśli pojawi się wewnętrzny błąd serwera, oznacza to, że mod_rewrite (.htaccess) jest włączony. Czy jesteś na wspólnym hoście?
ThinkingMonkey,
Nie, pracuję na moim hoście lokalnym, czy masz pojęcie, kiedy ładuje się plik .htaccess? Myślałem, że
Apacz
Pliki @macha .htaccess nigdy się nie ładują. Są one dostępne (jeśli są obecne) przez apache, gdy próbujesz uzyskać dostęp do strony, która jest obecna w tym folderze.
ThinkingMonkey,
ok, moje pytanie brzmiało, jeśli ktoś prosi o stronę internetową, czy apache bezpośrednio przechodzi do skryptów po stronie serwera, czy też szuka pliku .htaccess w tym folderze i kontynuuje?
macha
52

Odpowiedź „Wpisz jakąś niepotrzebną wartość” nie załatwiła mi sprawy, moja witryna nadal się ładowała pomimo wprowadzonych śmieci.

Zamiast tego dodałem następujący wiersz na początku pliku .htaccess:

deny from all

To szybko poinformuje Cię, czy .htaccess jest odbierany, czy nie. Jeśli używany jest plik .htaccess, pliki w tym folderze nie zostaną w ogóle załadowane.

caitriona
źródło
4
To najprostszy test, jeśli nie masz nic przeciwko, aby nic nie działało przez kilka sekund podczas weryfikacji.
Mordred
1
Tak - zajęło mi około sekundy sprawdzenie, czy strona, na której pracowałem, nie używa plików .htaccess.
bonh
1
Dzięki, działa jak marzenie :) zaoszczędził mi trochę czasu na debugowaniu!
Martijn van Hoof
32

Generalnie każda zmiana w .htaccess powinna mieć widoczne efekty. Jeśli nie ma efektu, sprawdź pliki konfiguracyjne Apache, na przykład:

<Directory ..>
    ...
    AllowOverride None
    ...
</Directory>

Powinien zostać zmieniony na

AllowOverride All

Będziesz mógł zmieniać dyrektywy w plikach .htaccess.

jgpATs2w
źródło
dzięki. Znalazłem odpowiednią sekcję w głównym pliku apache2.conf dla drzewa katalogów / var / www
Tim Richardson
6

Być może bardziej logiczną metodą byłoby utworzenie pliku (np. Test.html), dodanie treści, a następnie ustawienie go jako strony indeksowej:

DirectoryIndex test.html

W większości przypadków reguła .htaccess zastąpi konfigurację Apache podczas pracy na poziomie katalogu / pliku

Cez
źródło
4

Aby odpowiedzieć na pierwsze z trzech zadanych pytań, prostym sposobem sprawdzenia, czy plik .htaccess działa, czy nie, jest wywołanie niestandardowego błędu u góry pliku .htaccess:

ErrorDocument 200 "Hello. This is your .htaccess file talking."
RewriteRule ^ - [L,R=200]

Przechodząc do drugiego pytania, jeśli plik .htaccess nie jest odczytywany, możliwe, że główna konfiguracja serwera Apache została AllowOverrideustawiona na None. Dokumentacja Apache zawiera wskazówki dotyczące rozwiązywania problemów w tym i innych przypadkach, które mogą uniemożliwić działanie .htaccess.

Na koniec, aby odpowiedzieć na trzecie pytanie, jeśli chcesz debugować określone zmienne , do których odwołujesz się w swojej regule przepisywania, lub używasz wyrażenia , które chcesz ocenić niezależnie od reguły, możesz wykonać następujące czynności:

Wpisz zmienną, do której się odwołujesz, aby upewnić się, że ma oczekiwaną wartość:

ErrorDocument 200 "Request: %{THE_REQUEST} Referrer: %{HTTP_REFERER} Host: %{HTTP_HOST}"
RewriteRule ^ - [L,R=200]

Przetestuj wyrażenie niezależnie, umieszczając je w <If>dyrektywie. Pozwala to upewnić się, że wyrażenie jest poprawnie napisane lub dopasowane, gdy spodziewasz się, że:

<If "%{REQUEST_URI} =~ /word$/">
    ErrorDocument 200 "Your expression is priceless!"
    RewriteRule ^ - [L,R=200]
</If>

Miłego debugowania .htaccess!

PeterA
źródło
3

Jeśli masz dostęp do katalogu bin Apache, którego możesz użyć,

httpd -M aby najpierw sprawdzić załadowane moduły.

 info_module (shared)
 isapi_module (shared)
 log_config_module (shared)
 cache_disk_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 proxy_module (shared)
 proxy_ajp_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 socache_shmcb_module (shared)
 ssl_module (shared)
 status_module (shared)
 version_module (shared)
 php5_module (shared)

Po tym proste dyrektywy, takie jak Options -Indexeslub deny from allpotwierdzą, że .htaccess działa poprawnie.

Abhishek Gurjar
źródło
1

Aby przetestować reguły przepisywania htaccess, po prostu wypełnij adres URL, do którego stosujesz reguły, umieść zawartość htaccess w większym obszarze wejściowym i naciśnij przycisk „Test”.

http://htaccess.mwl.be/

Ganesh Kandu
źródło
-1

Dlaczego nie umieścić śmieci w pliku .htaccess i spróbować ponownie załadować apache. Jeśli Apache nie uruchamia się, wiesz, że działa. Usuń śmieci, a następnie załaduj ponownie apache, jeśli ładuje Gratulacje, poprawnie skonfigurowałeś .htaccess.

Ben Rabidou
źródło
7
Nie sądzę, że Apache nie uruchomi się lub nie uruchomi się, jeśli będzie zły .htaccess, biorąc pod uwagę, że nie sprawdza .htaccess, dopóki nie pojawi się żądanie strony.
Andrew,