Kompletna, przetestowana ścieżka naprawy — od diagnozy serwera, przez konfigurację Apache i Nginx, aż po najczęstszy błąd: duplikat bloku <Directory>, który cicho psuje cały rewrite.
Zanim cokolwiek zmienisz, sprawdź który serwer HTTP faktycznie działa. Konfiguracja Apache i Nginx różni się całkowicie — nie ma uniwersalnego pliku.
systemctl status apache2 systemctl status nginx
Moduł mod_rewrite odpowiada za czyste adresy URL. Bez niego reguły w .htaccess po prostu nie istnieją dla serwera.
sudo a2enmod rewrite sudo systemctl restart apache2
To jest najczęstsza przyczyna, dla której .htaccess „nie działa”. Apache domyślnie ignoruje ten plik ze względów bezpieczeństwa.
/* .htaccess ignorowany */ <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>
/* .htaccess aktywny */ <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory>
| Ustawienie | Efekt |
|---|---|
AllowOverride None | .htaccess całkowicie ignorowany |
AllowOverride All | .htaccess w pełni aktywny |
Po włączeniu AllowOverride All wklej to do /var/www/html/.htaccess. Ukrywa końcówki .html i podpina prawdziwą stronę 404.
RewriteEngine On # czyste linki .html RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^([^/.]+)/?$ $1.html [L] # prawdziwa strona 404 ErrorDocument 404 /404.html
Nginx nie zna pliku .htaccess — cała logika trafia bezpośrednio do konfiguracji server{}.
server { listen 80; server_name _; root /var/www/html; index index.html; location / { try_files $uri $uri.html $uri/ =404; } error_page 404 /404.html; location = /404.html { internal; } }
sudo systemctl restart nginx
Jeśli w apache2.conf masz dwa bloki dla tej samej ścieżki — jeden z None, drugi z All — konfiguracja staje się nieprzewidywalna. Apache czyta oba, kolejność decyduje, a debugowanie zamienia się w loterię.
<Directory /var/www/> AllowOverride None </Directory> /* ... reszta pliku ... */ <Directory /var/www/> AllowOverride All </Directory>
<Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> # reszta pliku bez zmian — linie zaczynające się od # # to komentarze, nie ruszaj ich
<Directory /var/www/> — ten z AllowOverride All. Usuń drugi całkowicie.Zawsze sprawdzaj składnię przed restartem — jeden błąd w konfiguracji potrafi ubić cały serwer WWW.
sudo apachectl configtest # oczekiwany wynik: Syntax OK sudo systemctl restart apache2
404.html leży w /var/www/html/404.html<Directory /var/www/> z AllowOverride Allapachectl configtest zwraca Syntax OK/abc123 pokazuje Twoją stronę 404/nazwa-pliku ładuje nazwa-pliku.html bez rozszerzenia