RewriteEngine On
# ======================
# SÉCURITÉ
# ======================
# Bloquer l'accès aux fichiers de configuration
Require all denied
# Bloquer les fichiers PHP dans includes/
Require all denied
# Protéger les répertoires sensibles
RewriteRule ^(includes|cache|docs|conf)/ - [F,L]
# Bloquer les fichiers samples et backups
Require all denied
# Bloquer les artefacts de documentation à la racine web
# (DEPLOY.adoc/html/pdf, README.adoc…) : ils divulguent le plan
# d'infrastructure et ne doivent jamais être servis s'ils sont copiés
# sur l'hébergement. [^/]+ = fichiers à la racine uniquement, les
# éventuels .html légitimes en sous-répertoire restent servis.
RewriteRule ^[^/]+\.(adoc|html|pdf)$ - [F,L,NC]
# Empêcher l'exploration des répertoires
Options -Indexes
# Bloquer l'accès aux fichiers cachés
Require all denied
# ======================
# RÉÉCRITURE D'URL
# ======================
# Masquer l'extension .php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
# Rediriger les URLs avec .php vers les URLs sans extension
# Sauf /ajax/ : un 301 transformerait le POST en GET et ferait perdre le token CSRF.
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteCond %{REQUEST_URI} !^/ajax/ [NC]
RewriteRule ^ /%1 [NC,L,R=301]
# Pour accéder à page.php via /page
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^/]+)$ $1.php [L]
# ======================
# HTTPS
# ======================
# Force HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} !on
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# ======================
# CACHE
# ======================
# Le Service Worker et le manifest ne doivent pas être cachés longtemps :
# le navigateur doit pouvoir détecter les nouvelles versions du site.
Header set Cache-Control "no-cache, must-revalidate"