Przepisywanie adresów URL przy użyciu pliku .htaccess i modułu mod_rewrite to kluczowe narzędzie każdego webmastera i specjalisty SEO. Technologia ta umożliwia zmianę skomplikowanych adresów na czytelne, zoptymalizowane pod SEO, wpływając na lepszą indeksację, bezpieczeństwo oraz wygodę użytkowników. Współczesne aplikacje webowe często wykorzystują tę funkcjonalność, by zapewniać intuicyjną nawigację oraz elastyczność backendu. Ten przewodnik dostarcza praktycznych wskazówek od podstaw konfiguracji po zaawansowane techniki wykorzystujące wyrażenia regularne.

Podstawy .htaccess i mod_rewrite

Plik .htaccess to zasadniczy element konfiguracyjny serwera Apache, umożliwiający zmianę ustawień na poziomie katalogów, bez edytowania głównych plików serwera. Powstał od wyrażenia „hypertext access” i na systemach Unix/Linux jest plikiem ukrytym.

Najważniejszym komponentem jest mod_rewrite, czyli silnik do manipulowania adresami URL w czasie rzeczywistym przy użyciu wzorców i wyrażeń regularnych. Dzięki temu mechanizmowi transformacja adresu odbywa się w pełni transparentnie dla użytkownika – korzysta on z przyjaznych linków, a Apache odpowiednio przekierowuje żądania do właściwych plików lub skryptów.

Zalety mod_rewrite obejmują możliwość budowania prostych, semantycznych i intuicyjnych adresów URL, korzystnych zarówno dla użytkowników, jak i wyszukiwarek. Np. adres http://example.com/product.php?category=electronics&id=123&color=red można zamienić na http://example.com/produkty/elektronika/123/czerwony, co ułatwia obsługę i poprawia SEO.

Aby skorzystać z mod_rewrite, należy aktywować moduł na serwerze poprzez komendę a2enmod rewrite (Debian/Ubuntu) oraz upewnić się, że w konfiguracji VirtualHost ustawiono AllowOverride All.

Składnia i struktura reguł przepisywania

Podstawową konstrukcją jest dyrektywa:

  • RewriteRule Pattern Substitution [Flags] – określa wzorzec, substytut i opcjonalne flagi;
  • Pattern – wyrażenie regularne, które dopasowuje fragment URL;
  • Substitution – nowy adres docelowy;
  • Flags – opcjonalne parametry wpływające na działanie reguły.

Najpopularniejsze flagi to:

  • [L] – sygnalizuje, że to ostatnia reguła w bloku;
  • [R=301] – wymusza trwałe przekierowanie (SEO);
  • [NC] – ignoruje wielkość liter;
  • [QSA] – zachowuje oryginalne parametry zapytania.

Przykładowa reguła: RewriteRule ^about$ about.html [NC] – zapytanie o about kieruje do pliku about.html, niezależnie od wielkości liter.

Można też stosować warunki RewriteCond przed regułą, np. sprawdzając %{HTTP_HOST} czy %{REQUEST_URI}. Wyrażenia regularne pozwalają pisać zaawansowane i elastyczne wzorce, wykorzystując metaznaki (^, $, ., +, *), a także grupy przechwytujące ($1, $2).

Konfiguracja i aktywacja mod_rewrite

Aktywacja mod_rewrite wymaga potwierdzenia, że moduł jest dostępny w Apache. W systemach Debian/Ubuntu aktywujemy go poleceniem sudo a2enmod rewrite, a następnie restartujemy serwer sudo systemctl restart apache2. W innych dystrybucjach Linux należy w pliku konfiguracyjnym Apache dodać:

LoadModule rewrite_module modules/mod_rewrite.so

Dla poprawnego działania mod_rewrite trzeba także w wirtualnym hoście zastosować dyrektywę AllowOverride All dla odpowiedniego katalogu:

<VirtualHost *:80>
  <Directory /var/www/html>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>

W pliku .htaccess należy na początku umieścić RewriteEngine On, aby aktywować silnik. Reguły .htaccess działają kaskadowo – plik nadrzędny wpływa na podkatalogi.

Testowanie pliku .htaccess przed wdrożeniem na produkcję jest niezbędne, by uniknąć błędów HTTP 500 i zablokowania strony. Skorzystaj z walidatorów online takich jak htaccesscheck.com oraz śledź logi serwera (/var/log/apache2/error.log).

Podstawowe techniki przepisywania URL

Do najczęstszych zastosowań mod_rewrite należą:

  • tworzenie aliasów do plików i katalogów bez duplikowania treści,
  • usuwanie rozszerzeń plików z URL, aby uzyskać czyste adresy (np. contact zamiast contact.php),
  • przekierowania z HTTP na HTTPS dla bezpieczeństwa,
  • przekierowania z wersji www na bez www lub odwrotnie, w celu uniknięcia duplikatów w wyszukiwarkach.

Typowa reguła wymuszająca HTTPS:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Przekierowanie z www na bez www:

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

Zaawansowane wzorce i wyrażenia regularne

W mod_rewrite korzystanie z wyrażeń regularnych pozwala budować bardzo rozbudowane zasady:

  • [0-9] – cyfry,
  • [a-zA-Z] – litery,
  • [a-zA-Z0-9_-] – litery, cyfry, podkreślenia i myślniki,
  • grupy przechwytujące pozwalają przekazać fragmenty URL jako parametry do docelowego skryptu.

Przykład przekształcenia URL z produktem:

RewriteRule ^produkty/([0-9]+)/$ /product.php?id=$1 [L]

Alternatywa (|) umożliwia obsługę różnych wersji danego segmentu URL, np.:

RewriteRule ^(artykul|artykuly|news)/([0-9]+)/?$ /article.php?id=$2 [L]

Dzięki różnorodności metaznaków i warunków RewriteCond możesz tworzyć nawet bardzo zaawansowane mechanizmy przepisywania ścieżek.

Praktyczne zastosowania w optymalizacji SEO

Czyste, opisowe URL-e silnie wpływają na pozycjonowanie strony. Adresy statyczne, zawierające słowa kluczowe, są lepiej indeksowane i bardziej atrakcyjne dla użytkowników. Przykładowa reguła:

RewriteRule ^artykuly/([a-z0-9-]+)/?$ /article.php?slug=$1 [L]

Obsługa wersji językowych dzięki mod_rewrite pozwala uzyskać czytelną strukturę:

RewriteRule ^(en|de|fr)/(.*)$ /index.php?lang=$1&page=$2 [L,QSA]

Prawidłowe projektowanie struktur hierarchicznych kategorii zapewni przejrzystość adresów oraz ich semantykę:

RewriteRule ^kategoria/([a-z0-9-]+)/podkategoria/([a-z0-9-]+)/?$ /content.php?cat=$1&subcat=$2 [L]
RewriteRule ^kategoria/([a-z0-9-]+)/?$ /category.php?name=$1 [L]

Poprawne uporządkowanie reguł w pliku .htaccess – od najbardziej specyficznych do ogólniejszych – jest kluczowe.

Paginacja może zostać uproszczona przyjaznymi adresami:

RewriteRule ^produkty/strona/([0-9]+)/?$ /products.php?page=$1 [L]

Walidacja liczby stron, np. dzięki warunkom RewriteCond $1 ^[1-9][0-9]*$, zwiększa precyzję działania mechanizmu.

Aby wyeliminować duplikację treści, stosuj kanonizację URL poprzez automatyczne przekierowania do wersji docelowej. Przykład:

# Usunięcie końcowego slasha dla plików
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [R=301,L]

# Dodanie końcowego slasha dla katalogów
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) $1/ [R=301,L]