Htaccess – debug

Czasem wprowadzane do pliku .htaccess reguły nadal nie chcą działać, choć sprawdziliśmy ich składnię, pozbyliśmy się literówek i poprzedziliśmy ukośnikiem (backslashem „\”) wszystkie znaki specjalne. Co teraz? Oczywiście czas na trochę debugowania!

Podgląd wartości zmiennych

Być może powiesz że słowo „debug” ma tutaj niekoniecznie 100% zastosowanie, ale jednak postanowiłem je użyć – to niby nie to, ale pasuje 😉

Jak ogólnie wiadomo, najpotężniejszym narzędziem do debugowania, crème de la crème jego jestestwa jest… funkcja „print” (czy w przypadku PHP również „echo”, „print_r”, „var_dump” – ale teraz wróćmy do Apache). I dlatego naturalnym pytaniem jest: Czy w .htaccess możemy sprawdzić wartości zmiennych które używamy? Tak, i jest na to kilka sposobów.

Użycie nagłówków HTTP

Osobiście to moja ulubiona, najprostsza i najszybsza metoda, wystarczająca w większości przypadków. Przygotowałem poniższy zestaw reguł, więc w zasadzie jest to gotowe rozwiązanie, w sam raz do szybkiego debugowania:

RewriteEngine On
RewriteRule (.) - [E=DUCH512_REQUEST:$1]
RewriteRule . - [E=DUCH512_HTTP_HOST:%{HTTPS}]
RewriteRule .* - [E=DUCH512_HTTP_HOST:%{HTTP_HOST}]
RewriteRule .* - [E=DUCH512_QUERY_STRING:%{QUERY_STRING}]
RewriteRule .* - [E=DUCH512_THE_REQUEST:%{THE_REQUEST}]
RewriteRule .* - [E=DUCH512_REQUEST_URI:%{REQUEST_URI}]
Header set X-Duch512-Request "%{DUCH512_REQUEST}e"
Header set X-Duch512-Https "%{DUCH512_HTTPS}e"
Header set X-Duch512-Http-Host "%{DUCH512_HTTP_HOST}e"
Header set X-Duch512-Query-String "%{DUCH512_QUERY_STRING}e"
Header set X-Duch512-The-Request "%{DUCH512_THE_REQUEST}e"
Header set X-Duch512-Request-Uri "%{DUCH512_REQUEST_URI}e"
Header set X-Duch512-R-Request "%{REDIRECT_DUCH512_REQUEST}e"
Header set X-Duch512-R-Https "%{REDIRECT_DUCH512_HTTPS}e"
Header set X-Duch512-R-Http-Host  "%{REDIRECT_DUCH512_HTTP_HOST}e"
Header set X-Duch512-R-Query-String "%{REDIRECT_DUCH512_QUERY_STRING}e"
Header set X-Duch512-R-The-Request "%{REDIRECT_DUCH512_THE_REQUEST}e"
Header set X-Duch512-R-Request-Uri "%{REDIRECT_DUCH512_REQUEST_URI}e"

W zestawie znajdziesz 5 najczęściej używanych zmiennych Apache oraz zapytanie przechwytywane przez „czystą” regułę RewriteRule (przydatne przy tworzeniu np. przekierowań 301 lub noindex). W podobny sposób można rozbudować/zmienić zestaw do własnych potrzeb.

Zasada działania jest prosta:

  1. Używając reguły „RewriteRule” i flagi „E” przechwytujemy zawartość zmiennych do zmiennych środowiskowych,
  2. Używając polecenia „Header set” ustawiamy wartości własnych nagłówków, które zobaczymy w odpowiedzi.

W ten sposób po przejściu na dowolną podstronę, w narzędziach deweloperskich w zakładce „Sieć” (Network) po wybraniu odpowiedniego zapytania w podglądzie nagłówków znajdziemy między innymi nasze nagłówki:

Apache .htaccess Debug - Custom HTTP Headers
Własne nagłówki HTTP dodane w celu debugu zmiennych serwera

Teraz wiemy na czym stoimy i szybciej znajdziemy np. brakujący ukośnik czy białe znaki. Do podglądu nagłówków możemy również użyć wtyczek do naszej przeglądarki, pokazujących je np. w pasku narzędzi.

Dzięki przedrostkowi (prefix) „X-” oznaczającego umownie własne nagłówki, oraz naszej własnej nazwie „DUCH512” mamy je odpowiednio zgrupowane (większość narzędzi do podglądu nagłówków sortuje je alfabetycznie) oraz unikamy konfliktów z już istniejącymi nagłówkami.

Własne nagłówki rozpoczyna się od przedrostka „X-” i jest to umowna, ogólnie stosowana zasada. Warto jednak wiedzieć że w szerokim zastosowaniu (np. tworząc aplikacje opierające swoje działania na nagłówkach) to rozwiązanie nie jest już rekomendowane, zobacz RFC 6648.

Użycie PHP + HTACCESS

Takie rozwiązanie jest bardziej skomplikowane i nie zawsze nadaje się do użycia np. gdy poprawiamy coś na „produkcji”, czyli np. stronie sklepu który w tym samym czasie jest odwiedzany przez klientów.

Polega ono na podmienianiu odpowiedzi ze stron błędów (np. 404) lub ładowaniu pliku .php zamiast wskazanego URL – a tego raczej byśmy nie chcieli. Dlatego naprawdę zainteresowanych odsyłam do pytania na StackOverflow, choćby dlatego że są to rozwiązania pokazujące inne, ciekawe możliwości serwera Apache 😉