BAZA KOMEND / DEBIAN / APACHE2

AllowOverride.htaccess Fix.

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.

root@serwer:~$ sudo apachectl configtest
01Diagnoza serwera

Zanim cokolwiek zmienisz, sprawdź który serwer HTTP faktycznie działa. Konfiguracja Apache i Nginx różni się całkowicie — nie ma uniwersalnego pliku.

bash — sprawdzenie usług
systemctl status apache2
systemctl status nginx
Jeśli apache2 jest active (running) → idź do kroku 02. Jeśli to nginx → przejdź do kroku 04.
02Apache — włącz rewrite

Moduł mod_rewrite odpowiada za czyste adresy URL. Bez niego reguły w .htaccess po prostu nie istnieją dla serwera.

bash
sudo a2enmod rewrite
sudo systemctl restart apache2
03Klucz problemu: AllowOverride

To jest najczęstsza przyczyna, dla której .htaccess „nie działa”. Apache domyślnie ignoruje ten plik ze względów bezpieczeństwa.

apache2.conf
/* .htaccess ignorowany */
<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
✕ Nie działa
apache2.conf
/* .htaccess aktywny */
<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>
✓ Działa
UstawienieEfekt
AllowOverride None.htaccess całkowicie ignorowany
AllowOverride All.htaccess w pełni aktywny
04.htaccess — gotowiec

Po włączeniu AllowOverride All wklej to do /var/www/html/.htaccess. Ukrywa końcówki .html i podpina prawdziwą stronę 404.

/var/www/html/.htaccess
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
05Alternatywa: Nginx

Nginx nie zna pliku .htaccess — cała logika trafia bezpośrednio do konfiguracji server{}.

/etc/nginx/sites-available/default
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;
    }
}
bash
sudo systemctl restart nginx
06Pułapka: duplikat <Directory>

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ę.

apache2.conf — ✕ niepewne
<Directory /var/www/>
    AllowOverride None
</Directory>

/* ... reszta pliku ... */

<Directory /var/www/>
    AllowOverride All
</Directory>
apache2.conf — ✓ poprawnie
<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
Zostaw tylko jeden blok <Directory /var/www/> — ten z AllowOverride All. Usuń drugi całkowicie.
07Weryfikacja i test

Zawsze sprawdzaj składnię przed restartem — jeden błąd w konfiguracji potrafi ubić cały serwer WWW.

bash
sudo apachectl configtest
# oczekiwany wynik:
Syntax OK

sudo systemctl restart apache2