1. Co je .htaccess
.htaccess je adresářový konfigurační soubor Apache. Pravidla platí pro adresář, ve kterém leží, a obvykle i pro podadresáře.
Doporučení: Máte-li přístup k hlavní konfiguraci Apache, je rychlejší zapisovat pravidla do bloku
<Directory>.2. Povolení AllowOverride
<Directory /var/www/html>
AllowOverride FileInfo AuthConfig Limit Indexes
Require all granted
</Directory>AllowOverride None soubory .htaccess vypne. Po změně spusťte:
sudo apachectl configtest
sudo systemctl reload apache23. Moduly na Raspberry Pi OS
sudo a2enmod rewrite headers expires deflate
sudo systemctl restart apache2
apache2ctl -M | grep -E 'rewrite|headers|expires|deflate'Neznámá direktiva nebo chybějící modul často způsobí HTTP 500. Kontrolujte /var/log/apache2/error.log.
4. Základní direktivy
# Komentář
DirectoryIndex index.php index.html
Options -Indexes
AddDefaultCharset UTF-8Options -Indexes zakáže výpis obsahu adresáře.
5. mod_rewrite a RewriteRule
RewriteEngine On
RewriteRule ^produkt/([0-9]+)/?$ produkt.php?id=$1 [L,QSA]V .htaccess se cesta zpravidla porovnává bez počátečního lomítka. $1 je první zachycená skupina.
6. RewriteCond
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [END,QSA]Podmínky znamenají, že cílem není existující soubor ani adresář.
7. Proměnné a přepínače
| Prvek | Význam |
|---|---|
%{HTTP_HOST} | doména |
%{REQUEST_URI} | URL cesta |
%{HTTPS} | on/off |
L | poslední pravidlo průchodu |
END | ukončí per-directory přepisování |
R=301 | trvalé přesměrování |
QSA | ponechá query string |
F | 403 Forbidden |
8. HTTPS a doména
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]Nová pravidla nejprve zkoušejte s R=302.
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]9. SEO URL a front controller
RewriteRule ^produkt/([a-z0-9-]+)/?$ product.php?slug=$1 [END,QSA,NC]RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [END,QSA]10. Ochrana SQLite a citlivých souborů
<FilesMatch "(?i)\.(sqlite|sqlite3|db|sql|bak|ini|log)$">
Require all denied
</FilesMatch>Důležité: SQLite databázi ukládejte mimo veřejný DocumentRoot.
11. Bezpečné uploady
Do složky uploads vložte samostatný .htaccess:
Options -Indexes
<FilesMatch "(?i)\.(php|phtml|phar|php[0-9])$">
Require all denied
</FilesMatch>12. Řízení přístupu a heslo
Require ip 127.0.0.1 ::1 192.168.1.0/24sudo htpasswd -c /etc/apache2/.htpasswd adminAuthType Basic
AuthName "Administrace"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user13. Bezpečnostní hlavičky
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>14. Cache a komprese
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "access plus 7 days"
ExpiresByType image/webp "access plus 30 days"
</IfModule><IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/css
AddOutputFilterByType DEFLATE application/javascript application/json
</IfModule>15. Kompletní základ pro PHP e-shop
Options -Indexes
DirectoryIndex index.php
AddDefaultCharset UTF-8
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [END]
RewriteRule ^produkt/([a-z0-9-]+)/?$ product.php?slug=$1 [END,QSA,NC]
RewriteRule ^ index.php [END,QSA]
</IfModule>
<FilesMatch "(?i)\.(sqlite|sqlite3|db|sql|bak|ini|log)$">
Require all denied
</FilesMatch>16. Ladění chyb
sudo apachectl configtest
sudo tail -f /var/log/apache2/error.log
sudo tail -f /var/log/apache2/access.log| Projev | Příčina |
|---|---|
| HTTP 500 | syntaktická chyba nebo chybějící modul |
| HTTP 404 | mod_rewrite není aktivní nebo vzor nesedí |
| Smyčka | podmínka nerozpozná cílový stav |
17. Checklist
- SQLite je mimo DocumentRoot.
- Je nastaveno
Options -Indexes. - V uploads nelze spouštět PHP.
- Administrace používá HTTPS.
- Konfigurace prochází
apachectl configtest.