Poskramiamy .htaccess – przekierowania i nie tylko

.htaccess to ciekawy plik, który pozwala kontrolować sporo rzeczy nieosiągalnych na pierwszy rzut oka. W przypadku SEO, .htaccess najczęściej używany jest do wzbogacenia witryny o tzw. friendly URLs czyli ładnie wyglądające adresy. Z tekstu poniżej dowiesz się jak - oprócz efektu przyjaznych URLi - osiągnąć jeszcze kilka innych, nie mniej ciekawych.

Friendly URLs

Efekt fajnych URLi możliwy jest tylko wtedy, gdy nasz serwer Apache posiada mod_rewrite (ważne: serwer Apache, nie MS IIS). Jeśli dana witryna ma mało przyjazny, trudny do zapamiętania system generowania linków wewnętrznych, możemy sprawić, że przyjmą one pożądaną przez nas postać. Wyobraźmy sobie, że mamy linki widoczne jako /index.php?strona=akwaria i chcemy zmienić je na /strona/akwaria/ lub po prostu /akwaria/. Choć linki zmienią postać, to tak naprawdę cały czas odwołujemy się do ich pierwotnej postaci. Różnica polega na tym, że robi to za nas serwer, i robi to w sposób niewidoczny.

# inicjujemy rewrite engine
RewriteEngine on

# dla przykładu z www.strona.pl/strona/akwaria/
RewriteRule ^strona/([^/.]+)/?$ index.php?strona=$1 [L]

# dla przykładu z www.strona.pl/akwaria/
RewriteRule ^/([^/.]+)/?$ index.php?strona=$1 [L]

Końcowy slash

Przepisując URLe w sposób podany powyżej należy pamiętać o slashach na końcu adresu. Aby upewnić się, że zawsze tam będą, stosujemy następujący zapis:

RewriteEngine on

# nie dodajemy nic jeśli żądany plik istnieje
RewriteCond %{REQUEST_FILENAME} !-f

# sprawdzamy czy dany URL nie ma slasha na końcu
RewriteCond %{REQUEST_URI} !(.*)/$

# jeśli nie ma, przepisujemy URL z przekierowaniem 301
RewriteRule ^(.*)$
://%{HTTP_HOST}/$1/ [L,R=301]

Jedna rada – sprawdzenie poprawności przekierowań może być uciążliwe jeśli od razu zapiszemy je z flagą R=301 (która oznacza trwałe przekierowanie). Przeglądarki zapamiętują permanentnie przekierowane adresy w pamięci podręcznej, więc jeśli coś się zmieni w pliku .htaccess – przeglądarka tego nie uwzględni widząc wcześniej 301 i będzie się zachowywać bez zmian. Z tego powodu lepiej w fazie testowej użyć R=302, które oznacza przekierowanie czasowe. Działa identycznie jak 301, ale browser za każdym razem sprawdzi dokąd przekierowanie prowadzi.

Jeśli chcesz stosować dopisywanie końcowego ukośnika wraz z friendly URLs to zapis dotyczący slasha musi być umieszczony w ‘.htaccess’ jako pierwszy.

Przekierowanie z www na bez www i vice versa

Nie wszyscy wiedzą, że adresy:

  • http://www.domena.pl/
  • http://domena.pl/
  • https://www.domena.pl/
  • https://domena.pl/

to - z punktu widzenia wyszukiwarek - odrębne serwisy. Aby uniknąć problemów z duplikacją treści bardzo dobrym pomysłem jest wybranie tylko jednego adresu i ustawienie przekierowania na drugim. Jak ustawić przekierowanie?

RewriteEngine on

# przekierowanie dla przykładu z www na bez www
RewriteCond %{HTTP_HOST} ^www.domena.pl$ [NC]
RewriteRule ^(.*)$ http://domena.pl/$1 [R=301,L]

# przekierowanie dla przykładu z bez www na www
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Przekierowanie na nową domenę

Zdarza się to rzadko, nie mniej zdarza się :). Jeśli przenosimy witrynę na nową domenę:

RewriteEngine On
RewriteRule ^(.*)$ http://www.nowadomena.pl/$1 [R=301,L]

Powyższy przykład zadziała tylko wtedy, jeśli wewnętrzna struktura przenoszonych adresów nie uległa zmianie na nowej lokalizacji. Gdyby coś się zmieniło stary adres zrealizuje przekierowanie R=301 prawidłowo, wskaże nową lokalizację przeglądarce, ale użytkownik zobaczy na ekranie błąd 404.

Zabezpieczanie folderu przed listowaniem plików

Jeżeli w jakimś z folderów nie mamy pliku index.(html|htm|php), to serwer najczęściej pokaże listę wszystkich dostępnych plików. Dla części webmasterów może to być niepożądany efekt. Aby zabezpieczyć foldery przed ukazywaniem zawartości możemy więc albo utworzyć dziesiątki pustych plików index.html, albo dodać następujący wpis do .htaccess:

Options All -Indexes

Dedykowane strony dla błędów

Czasem zdarza się, że na witrynie występuje błąd. Najczęściej jest to błąd 404, rzadziej zdarzają się także np. wewnętrzne błędy serwera, oznaczane kodem 50x. Dzięki odpowiednim wpisom w .htaccess możemy dla każdego błędu zdefiniować unikalną stronę z odpowiednim komunikatem:

# dla błędu 404
ErrorDocument 404 /nieznalezionopliku.html
# dla błędu 500
ErrorDocument 500 /bledy/500.html

Możliwe jest przypisanie stron dla następujących błędów:

  • 401 – Authorization Required (wymagana autoryzacja)
  • 400 – Bad request (niepoprawne żądanie)
  • 403 – Forbidden (dostęp zabroniony)
  • 500 – Internal Server Error (wewnętrzny błąd serwera)
  • 404 – File not found (nie znaleziono pliku)

Zabezpieczanie folderu hasłem

W trakcie prac nad witryną często dobrym pomysłem ograniczenie dostępu do wersji rozwojowej. Dzięki .htaccess możemy zabezpieczyć dostęp do danego folderu hasłem.

AuthType basic
AuthName "Witryna wymaga autoryzacji"
AuthUserFile /home/sciezka/.htpasswd
Require valid-user

Jak widać, tym razem odwołujemy się jeszcze do pliku .htpasswd. Ścieżka do niego powinna być pełna. Zawartość stanowi zestawienie nazwa_użytkownika:hasło. Przykładowy listing pliku: user1:aGyShsiiEkuWk user2:aGaVpPSVCdcIs Poszczególne pary nazwa_użytkownika:hasło powinny być zawsze jedna pod drugą. Całość wpisu można wygenerować z konsoli, jeśli mamy na danej maszynie zainstalowanego Apache’a (polecam manual polecenia htpasswd). Jeśli nie mamy programu lokalnie – nie trzeba rozpaczać. Z pomocą przychodzą liczne wersje online, do znalezienia w Google.

Po tych zabiegach folder jest zabezpieczony hasłem. Wymaga autoryzowania każdej sesji od wszystkich zainteresowanych użytkowników.

Istnieje także możliwość zostawienia sobie furtki tylko dla siebie.

AuthType basic
AuthName "Witryna wymaga autoryzacji"
AuthUserFile /home/sciezka/.htpasswd
AuthGroupFile /dev/null
Require valid-user
Deny from all
Allow from 111.222.33.44
Satisfy Any

Oczywiście w miejsce 111.222.33.44 należy wpisać własne IP.