Moving Menu

.htaccess - przyjazne linki, wymuszanie połączeń szyfrowanych i inne przydatne rzeczy

corner .htaccess - przyjazne linki, wymuszanie połączeń szyfrowanych i inne przydatne rzeczy
Większość osób, które miały okazje posiadać własne strony spotkały się z plikiem .htaccess. Kojarzy się on im głównie z "przyjaznymi linkami". Niegdyś korzystając z jakichś CMSów, gdy chciało się mieć "ładne linki", trzeba było umieścić na serwerze odpowiednio przygotowany plik .htaccess. Obecnie systemy te generują je często samodzielnie. Jednak zastosowanie tego pliku nie ogranicza się tylko do tworzenia przyjaznych URL. Zakres jego zastosowań jest dużo większy i w tym wpisie zostaną przedstawione zarówno podstawowe zastosowania jak i te mniej znane.

 

Czym jest .htaccess?

Plik ten jest niczym innym jak plikiem konfiguracyjnym serwera stron WWW. Zastosowany został w najpopularniejszym obecnie serwerze WWW - Apache. Jednak korzystać z niego możemy już nie tylko w Apache, również LiteSpeed wspiera reguły w takiej konwencji. Przy jego pomocy możemy zmienić konfiguracje serwera WWW w danym folderze oraz w jego podfolderach. Możliwość wykonywania takich zmian daje nam bardzo wiele możliwości, które postaram się przedstawić na praktycznych przykładach w dalszej części wpisu.  

Moduł mod_rewrite

Plik .htaccess wraz z mod_rewrite idą ze sobą w parze. Większość zastosowań tego pliku wymaga aktywnego mod_rewrite na serwerze. Bez tego modułu nie bylibyśmy w stanie dokonywać przekierowań. Funkcjonalność przekierowań jest nam potrzebna praktycznie na każdym kroku. Zarówno gdy chcemy utworzyć ładnie wyglądające adresy WWW, również wtedy, gdy potrzebujemy wymusić adresy z www. lub połączenia szyfrowane, czy wtedy gdy po prostu chcemy przekierować użytkowników na inną stronę. Reguły rewrite pisane są z wykorzystanie wyrażeń regularnych, co może stanowić pewien problem z ich zrozumieniem oraz stworzeniem własnych. Pewne rzeczy można wydedukować z przykładów, jednak czasami dobrze jest poszukać w sieci co znaczy konkretny "znak".  

Przyjazne linki

Na pierwszy ogień pójdą ładnie wyglądające linki. Jeśli nie chcemy, aby użytkownik poruszał sie po naszej stronie korzystając z adresów w postaci:

http://domena.pl/index.php?page=artykul&id=22

  Możemy zastosować stosunkowo prostą regułkę.

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z-_0-9]+)/([a-zA-Z-_0-9]+)/?$ index.php?page=$1&id=$2 [L]
RewriteRule ^([a-zA-Z-_0-9]+)/?$ index.php?page=$1 [L]

  RewriteEngine on - włącza nam moduł rewrite, gdyby taki nie był włączony. RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d oznaczają, że podana ścieżka nie może kierować do folderu lub do pliku. Jeśli podana ścieżka kieruje na folder lub plik to prezentowana jest wartość folderu lub pliku, a nie są wykonywane przepisania. I ostatecznie przechodzimy do RewriteRule ułożonych w ten sposób że dopasowują ciągi alfanumeryczne zawarte między / i przepisują je do zmiennych $1 , $2. Bystre oko już zauważy, że wartości pomiędzy / zostaną wstawione jako nasze wartości paramterów GET. Teraz możemy wywołać nasz link korzystając z jego przyjaznej wersji:

http://domena.pl/artykul/22

  Gdybyśmy chcieli zwiększyć ilość parametrów w naszych regułach należy przez analogie tworzyć kolejne dopasowania, pamiętając o tym że należy je umieszczać od najbardziej skomplikowanej do najłatwiejszej. Flaga [L] powoduje że po dopasowaniu jednej z reguł, reszta jest pomijana. Sposób ten jest oczywiście dość prosty i uciążliwy. W realizacjach CMS zazwyczaj cały ciąg znaków po naszej domenie przekazywany jest do jednej zmiennej i odpowiednio obrabiany już przy pomocy skryptu. Jednak do mniejszych stron opisany sposób w zupełności wystarczy.  

Wymuszenie połączenia szyfrowanego

Z wykorzystanie .htaccess możemy również wymusić połączenie szyfrowane, jeśli chcemy zadbać o bezpieczeństwo użytkowników naszej strony. Wykonamy to również przy użyciu przekierowań. Teoria jest bardzo prosta. Jeśli użytkownik korzysta z protokołu http:// należy go przekierować na naszą stronę ale tak by używał https:// A zrealizować to można w sposób następujący:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

  Dokładnie tak jak brzmi teoria zostało to zrealizowane. Kolejną uruchomiamy moduł rewrite, sprawdzamy warunek czy używany jest protokół https, jeśli nie to dokonujemy przekierowania na identyczny adres jak podany w pasku adresu z tym tylko, że już przy wykorzystaniu https.  

Zmiana domeny - przekierowanie 301

Jeśli zmieniamy domenę naszego serwisu powinniśmy skorzystać z przekierowania 301. Jest to przekierowanie stałe. Ten sposób przekierowania ma jedna podstawową zaletę. Google rozpoznaje je i wie, że nastąpiła zmiana domeny, a nie, że powstał nowy serwis pod inną domeną. Dzięki temu przekazywana jest moc starej domeny więc również pozycja w wynikach wyszukiwarki. Najprościej możemy je zrealizować w taki sposób:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www.)?stara-domena.pl [NC]
RewriteRule (.*) http://nowa-domena.pl/$1 [R=301,L]

  Przekierowanie to uwzględnia zarówno wersje adresów z WWW oraz tych bez przedrostka WWW.  

Wymuszenie przedrostka WWW i bez WWW

Jeśli chcemy, aby nasza strona widoczna była w sieci pod jedną wersją adresu, niezależnie od tego co pisze użytkownik, możemy tą wersję wymusić. Dodatkowo ma to pozytywny wpływ na google, bowiem może ono traktować wersje z www i bez www jako dwie osobne strony. Wymuszenie WWW:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Wymuszenie adresu bez WWW:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

 

Blokowanie hotlinkowanych zasobów

Jesli nie chcesz, aby jakiś serwis korzystał z plików umieszczonych bezpośrednio na twoim serwerze, przy pomocy .htaccess możesz takie zasoby zablokować. Aby dokonać tego dla danej strony wystarczy skorzystać z regułki:

RewriteEngine On
RewriteCond %{HTTP_REFERER} blokowany-adres-strony.pl [NC]
RewriteRule .* - [F]

 

Blokowanie wyświetlania zawartości katalogów

Możemy również uniemożliwić podglądanie zawartości katalogów na naszym serwerze. Rozwiązanie takie poprawia nasze bezpieczeństwo i ogranicza dostęp do zasobów.

Options -Indexes

  Jeśli potrzebujemy zezwolić na przeglądanie folderów należy zastosować opcje:

Options +Indexes

 

Blokowanie dostępu do strony po IP

Możemy w łatwy sposób zablokować adresy IP, które są niechciane na naszej stronie. Aby to zrobić wystarczy zastosować taki wpis:

order allow, deny
deny from 111.111.111.111
deny from 222.222.222.222
allow from all

  Oczywiście możemy tutaj podać dowolną ilość adresów IP stosując prostą analogie.  

Zezwalanie na dostęp określonym IP

Aby wykonać coś takiego, wystarczy po prostu zablokować wszystkie adresy IP i zezwolić jedynie wybranym na dostęp. Przykładowy wpis może wyglądać w następujący sposób:

deny from all
allow from 111.111.111.111
allow from 222.222.222.222

  Tutaj również możemy analogicznie zezwalać na dostęp do strony kolejnym adresom IP.  

Blokowanie dostępu po User Agent

Jeśli Twoją stronę nęka jakiś robot. Generuje sztuczny ruch, wykorzystuje zasoby. Możesz spróbować go zablokować dopasowując jego User Agent, czyli informację jaka przedstawia się serwerowi.

SetEnvIfNoCase User-Agent .*charakterystyczna_fraza.* bad_bot
Order Allow,Deny
Allow from all
Deny from env=bad_bot

  Roboty często przedstawiają się serwerowi w sposób odmienny od przeglądarek. Jeśli poznasz User Agenta takiego bota (a możesz go odczytać z access logów serwera www) isteniej szansa zablokowania takiego robota. Działanie takie mają sens gdy robot zmienia swoje IP oraz jego odwiedziny powodują wykorzystanie zasobów naszego serwera. Miedzy .* a .* należy umieścić kawałek charakterystyczny dla User Agenta. Oczywiście regułę można zastosować dla wielu botów, wystarczy jedynie powielić linie SetEnvIfNoCase User-Agent .*charakterystyczna_fraza.* bad_bot - i podać inny User Agent

Podsumowanie

Plik konfiguracyjny Apache - .htaccess to potężne choć z pozoru bardzo proste narzędzie. Przedstawione tutaj możliwości nie są jedynymi. Pominięte zostały przykładowo możliwości modyfikacji konfiguracji PHP. Wiele z przedstawionych problemów można rozwiązać w inny sposób, jednak taka właśnie jest specyfika budowania warunków, że każdy może podejść do nich inaczej. Konfiguracja z wykorzystanie .htaccessa jest elastyczna może go dostosować dokładnie do swoich potrzeb. Najczęściej zapewne będziesz korzystać z mod_rewrite, jednak warto pamiętać o tym, że istnieją również inne możliwości, które potrafią na szybko rozwiązać problemy związane z ograniczeniem dostępu do strony czy ochroną naszej instalacji przed atakami. Z punktu widzenia administratora znajomość .htaccess jest bardzo przydatna.

comments powered by Disqus

Powiązane

photo corner
Różnice w wersjach PHP

W dzisiejszym wpisie chciałbym krótko przybliżyć Wam język PHP, oraz pokazać najważniejsze zmiany, jakie w ostatnich latach zostały w nim wprowadzone.

Czytaj więcej
photo corner
Zen Coding - HTML/CSS z prędkością światła (cz.I)

Wydajność jest dla kodera HTML/CSS sprawą kluczową. Kiedy opanujemy już składnię i podstawowe techniki oraz wdrożymy pierwsze projekty, czas kodowania nabiera podstawowego znaczenia. Z pomocą przychodzą nam rozmaite narzędzia. Dla mnie, najważniejszym jest Zen Coding, które w niezwykły sposób pozwala mi pisać kod kilkakrotnie szybciej.

Czytaj więcej
photo corner
Zen Coding - HTML/CSS z prędkością światła (cz.II)

W pierwszej części artykułu przedstawiłem Zen Coding jako niezwykłe ułatwienie w pracy kodera. Dowiedzieliśmy się, m.in. jak za pomocą jednej linijki pseudokodu napisać cały dokument HTML. Dziś przyjrzyjmy się rozwiązaniom, które przyspieszą naszą pracę z CSS. Zapraszam do lektury!

Czytaj więcej