16 sierpnia 2016

Mod Rewrite

Operowanie mod_rewrite daje nam duże możliwości unikania powielenia treści, szczególnie w zakresie niespójności adresów. Dzięki przedstawionym technikom będziecie mogli ustanowić odpowiednie przekierowania, dzięki którym dane podstrony będą dostępne tylko z jednej wersji adresu internetowego. Stosowanie reguł przepisywania adresów i przekierowań w technikach przepisywania adresów (mod rewrite) pomogę Wam uniknąć dostępności jednej i tej samej podstrony z kilku adresów URL.

Przykład: Bez stosowania technik, opisanych w kolejnych punktach jedna i ta sama podstrona (http://adres.pl/test/index.html) jest dostępna aż z 6 adresów URL:

  • http://adres.pl/test
  • http://adres.pl/test/
  • http://adres.pl/test/index.html
  • http://www.adres.pl/test
  • http://www.adres.pl/test/
  • http://www.adres.pl/test/index.html

Teoretycznie należało by uwzględnić jeszcze dwie możliwe formy:

  • http://www.adres.pl/test/index.htm
  • http://adres.pl/test/index.htm

Wyobraź sobie, że każdy kto linkuje do tej strony wybiera pasujący jemu sposób? I tak zamiast linkować jeden URL utrzymujesz 6 sztucznych bytów, które prezentują dosłownie to samo. Powyża lista sugeruje jednocześnie problemy, z którymi będziemu musieli sobie poradzić:

  • usuwać zbędne index.html/.php na końcu
  • dodawać lub usuwać slash (znak /) w adresach URL
  • eliminować zbędną subdomenę www. (lub ją wymuszać).

W kolejnych podrozdziałach przedstawione zostały odpowiednie kody, które należy wkleić do swojego pliku .htacces na serwerze. Jeśli go nie ma należy go utworzyć przy pomocy chociażby TotalCommandera.

Przepisywanie adresów ma nie tylko takie zastosowanie!

Parametry w adresach URL

Wraz z rozwojem i popularyzacją technologii tworzenia stron internetowych, jaką jest PHP należy unikać tworzenia adresów zawierających ciągi parametrów, które powodują generowanie dynamicznej treści w zawartości podstron. Duża ilość skryptów – na przykład for czy blogów, wykorzystuje takie parametry by generować odpowiedni treści wewnątrz serwisu. Przykład adresu z parametrami:

http://adres.pl/?kategoria=programowanie&wpis=16

Problem jaki rodzą takie adresy, jest fakt, że można poszczególne parametry przestawić. Takie same treści otrzymamy z adresu, w którym parametry ułożone by były tak:

?id=16&kategoria=programowanie

Jak widać powyżej, przestawiona została kolejność parametrów ID oraz kategoria. Takie generowanie treści utrudnia robotom indeksowanie strony, gdyż te same treści są dostępne z kilku lokalizacji URL, dlatego należy zrezygnować w ramach możliwości z takiego adresowania. Aby uniknąć takich sytuacji można wykorzystać w ramach możliwości dobrodziejstwa mod_rewrite.

Budując, dosyć dawno katalog stron internetowych również chciałem uniknąć problemu parametrów w adresie. Skorzystałem z prostej metody, która jednym zamachem pomogła mi w ukryciu parametrów zarówno kategorii, subkategorii i konkretnych podstron. Reguły dotyczące mod_rewrite należy zapisywać w dokumencie .htaccess na serwerze naszej strony.

RewriteEngine On
RewriteRule ^([a-z0-9-_]+),([a-z0-9-_]+).html$ $1.php?id=$2 [L,NC,NS]

Powyższa regułka przepisywania składa się z następujących elementów:

  • RewriteEngine On – oznacza, włączenie opcji przepisywania adresów.
  • RewriteRule – to początek nowej reguły przepisywania.
    • ^ – rozpoczyna wyrażenie regularne.
    • ([a-z0-9-_]+),([a-z0-9-_]+).html – cała zawartość reguły, w której występują dwa ciągu ([a-z0-9-_]+) – czyli mogą zawierać wszystkie litery i cyfry. Pomiędzy dwoma ciągami jest , – każdy znak specjalny należy poprzecie Więc ten zapis mówi, że po środku jest przecinek. Na końcu dopisany został .html – by adres dokumentu sugerował zwykły dokument html.
    • $ oznacza koniec wyrażenia regularnego, do którego będą porównywane wpisywane adresy.
  • $1.php?id=$2 – To część na jaką zostaną przepisane adresy, wyciągnięte z prawidłowych adresów. Jak widać, są to adresy z parametrami. Nie będą one jednak rozpoznawane przez roboty wyszukiwarek, które otrzymają pełne adresy. Pierwsze ($1) odwołuje się do pierwszego ciągu znaków ([a-z0-9-_]+), a $2 do kolejnego licząc od prawej.

Dzięki takiemu prostemu zapisowi nie było konieczności korzystania z adresów takich:http://adres.pl/katalog.php?id=15

Gdyż ten adresy był wczytywany, przy wpisaniu takiego pełnego URL: http://adres.pl/katalog,15.html. W dużym uproszczeniu i nie jest tak dosłownie, skrypt zamienia przecinek występujący w przyjaznym adresie internetowym, na taki zapis .php?id=, dzięki czemu wczytywane są odpowiednie treści jak przy wykorzystaniu adresów z parametrami.

Powyższa reguła może nie pasować do Twojego serwisu, gdyż dla każdej struktury regułki mod_rewrite mogą wyglądać inaczej.