mod_rewrite w praktyce - przyjazne, krótkie adresy URL

Data aktualizacji: 22.04.2024r. Autor: Bartosz Stefanicki.

mod_rewrite w praktyce - przyjazne, krótkie adresy URL

Moduł mod_rewrite pozwala na tworzenie krótszych adresów - przyjrzyjmy mu się bliżej.

Jak powszechnie wiadomo, na stronach internetowych warto udostępniać użytkownikom nawigację (nie zgubią się pośród wielu kategorii, podstron itd). Poza tym warto zadbać o prostą konstrukcję adresów URL - jak wspomniałem wcześniej - ze względu na użytkownika i wyszukiwarki.

Serwer Apache udostępnia moduł mod_rewrite. Umożliwia on przy minimalnym nakładzie pracy, uzyskanie efektu który zająłby normalnie więcej czasu. Dokładniej chodzi o "przepisywanie linków" - czyli na przykład zamiana formy /?d1=artykul&id=4543oje na następującą /artykul/tytul-newsa/.

Tworzymy plik o nazwie .htaccess. Wklejamy do niego niżej wymieniony kod, w ten sposób informujemy serwer jaką operację planujemy wykonać.

Options FollowSymLinks
RewriteEngine On

Przepisywanie: adres-strony.pl na www.adres-strony.pl

Następnie tworzymy przekierowanie - użytkownicy którzy weszli na stronę bez przedrostka "www" zostaną przeniesieni na taką.

RewriteCond %{HTTP_HOST} ^adres-strony.pl
RewriteRule (.*) http://www.adres-strony.pl/$1 [R=301,L]

"Ręczne" przepisywanie

Dla przykładu z postaci podstrona.php na podstrona.html. Zmieniając rozszerzenia plikom ułatwimy indeksowanie witryn robotom wyszukiwarek. Patrząc na posunięcia większości znanych witryn i portali, bardziej korzystne i naturalne będzie rozszerzenie ".html" niż takie ".php".

RewriteRule ^podstrona.html$ podstrona.php [L]
  • podstrona.php - obecny adres
  • podstrona.html - adres który chcemy uzyskać

Dynamiczne przepisywanie

Dla przykładu z postaci "http://adres-strony.pl/?d1=artykuly&d2=informacje" na "http://adres-strony.pl/artykuly/informacje.html". Zobaczmy jak zmienić adres do postaci bardziej czytelnej, prostej i przyswajalnej. Warto wspomnieć że omawiana "zamiana" będzie dokonywana w sposób automatyczny, bez konieczności ingerencji użytkownika (nie będzie trzeba wprowadzać osobno każdej podstrony).

RewriteRule ^(.+)/(.+).html$ index.php?d1=$1&d2=$2 [L]

Powyższy przykład zmieni index.php?d1=wartosc1&d2=wartosc2 na /wartosc1/wartosc2.html. Natomiast poniższy z index.php?d1=wartosc1 na /wartosc1.html.

RewriteRule ^(.+).html$ index.php?d1=$1 [L]

Jeżeli po wysłaniu pliku .htaccess na serwer pojawi się błąd treści "Interial Server Error" oznacza to, że serwer nie obsługuje przepisywania adresów url (mod_rewrite).

Kategorie: PHP + MySQL. Tagi: #cms, #htaccess, #php. Źródło obrazków: Pixabay, Font awesome.

Zobacz także

10 komentarzy

callisto
26.04.2016, 19:08
Witam używam takiego kodu do tworzenia podstrony w htaccess, jest bezpieczny? RewriteRule ^([^/]*)?/?$ index.php?$1 [L]
adi
30.08.2014, 11:06
a jeśli mam cos takiego: domena.pl/shop/products/178 i chcę by się wyświetlało domena.pl/klep/produkty/felgi to jak to przepisać? da sie zamienić '/products/178/' na samo '/felgi/'?
Bartosz Stefanicki
02.09.2014, 17:38
Autor
Poszukaj w pliku .htaccess i sprawdź obecne ustawienia.
Krzysiek
08.08.2013, 22:04
Drążę temat i są już małe postępy, ale i nowe pytania. Zobaczcie poniższy opis i doradźcie co można zrobić: Sprawa wygląda tak: mam stronę zwykłą w html, która jest na serwerze w folderze o nazwie domena.pl, w tym folderze jest np index.html i podfolder z np. o-nas.html. szukam rozwiązania jak uchronić się przed powielaniem treści: http://www.domena.pl domena.pl domena.pl/index.html itp. Zależy mi również na wyrzuceniu z url rozszerzenia .html, żeby link wyglądał tak: domena.pl/podfolder/o-nas w tym celu w .htaccess mam tak: RewriteEngine on RewriteBase / RewriteCond %{HTTP_HOST} !^domena.pl [NC] RewriteRule ^(.*)$ http://domena.pl%{REQUEST_URI} [R=301,L] RewriteRule ^index.html$ http://domena.pl/ [R=301,L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ $1 Cel teoretycznie jest osiągnięty, bo url’e wyglądają jak powinny. Problem w tym, że jak wpiszę z palca domena.pl/podfolder/o-nas.html to też przywołuje stronę, a chciałbym żeby wogóle nie było dostępu do plików z rozszerzeniem html przez wpisywanie z palca. Czy masz na to jakieś rozwiązanie? Na niektórych stronach widzę, że przekierowuje na 404 jak się wpisuje z rozszerzeniem .html. Jak to można zrobić?
Bartosz Stefanicki
11.08.2013, 21:56
Autor
Przekierowanie 301 z www.nazwa-strony.pl/index.php na www.nazwa-strony.pl [code lang="php"]RewriteEngine on RewriteCond %{REQUEST_URI} ^/index.php$ RewriteCond %{QUERY_STRING} ^$ RewriteRule ^(.*)$ http://www.nazwa-strony.pl/ [L,R=301][/code]
kuba
10.05.2011, 17:36
Mam taki kod: Options FollowSymLinks RewriteEngine On RewriteRule ^index.html$ index.php [L] Gdy wpisuje w przeglądarce adres strony, to nadal mi się wyświetla index.php, jak to zrobić żeby w pasku adresu wyświetlał się index.html?
Ebro
01.02.2011, 21:28
Absolutna podstawa, jeżeli chcemy, by nasz serwis był seo-friendly ;)
Boxi
01.11.2010, 15:56
Nie wiem czy dobrze zrobiłem, ale po kolei: 1. Dodaj filtr 2. Typ - Włącznie 3. Pole filtra: nazwa Hosta 4. Wzorzec: blabla.pl/wp-content/uploads/ 5. Dodaj i zapisz. I po tych czynnościach powinny mi się pojawiać statystyki oglądalności danych zdjęć?
Boxi
01.11.2010, 11:25
Ja mam z kolei inne pytanie. Czy można sprawdzić statystyki w google analytics ile osób weszło na podany adres obrazka z rozszerzeniem .jpg np http://itporady.pl/files/images/phpthumb/phpThumb.php?src=../logo/apache-m.png&w=110&h=110&zc=B&f=png&q=90
Bartosz Stefanicki
01.11.2010, 12:59
Autor
@Boxi, przeczytaj o filtrach w Google Analytics.