# ===================================================== # Sillycone Village # Configuration Apache sécurisée pour site statique Hugo # ===================================================== # # ⚠ SYNCHRONISATION : ce fichier gouverne en réalité TOUT le compte OVH # (vitrine/, horairefacile/, api.php…) une fois déployé à la racine, pas # seulement ce site Hugo — l'héritage .htaccess d'Apache descend dans tous # les sous-dossiers. La copie de référence est désormais # SiteEcoSlow/.htaccess (voir son en-tête pour le détail complet) : c'est # là que vit le code PHP qui dépend de la règle Authorization ci-dessous, # et c'est elle que build-output.sh génère automatiquement dans # output/www/.htaccess. Si vous modifiez l'un des deux fichiers, reportez # le changement dans l'autre. # ===================================================== # ----------------------------------------------------- # 1. Forcer HTTPS # ----------------------------------------------------- RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # ----------------------------------------------------- # 1bis. Transmettre l'en-tête Authorization à PHP # ----------------------------------------------------- # Sur ce type d'hébergement mutualisé, PHP tourne en CGI/FastCGI : Apache # ne transmet PAS l'en-tête HTTP Authorization à $_SERVER par défaut. Sans # cette règle, requireBearer() (php/www/helpers.php) reçoit toujours un # token vide, quel que soit le Bearer Token envoyé par le client — d'où un # 401 "Token manquant ou invalide" même avec le bon token (vu sur # api.php/auth/verify-token). RewriteCond %{HTTP:Authorization} ^(.+)$ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # ----------------------------------------------------- # 2. Protection contre accès fichiers sensibles # ----------------------------------------------------- Require all denied # Bloquer l'accès au fichier .htaccess lui-même Require all denied # ----------------------------------------------------- # 3. Headers de sécurité HTTP # ----------------------------------------------------- # Empêche le navigateur de deviner les types MIME Header always set X-Content-Type-Options "nosniff" # Protection contre certaines attaques XSS anciennes Header always set X-XSS-Protection "1; mode=block" # Contrôle des informations envoyées aux sites externes Header always set Referrer-Policy "strict-origin-when-cross-origin" # Désactive les fonctionnalités navigateur inutiles Header always set Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=(), usb=()" # Protection contre l'intégration dans une iframe externe Header always set X-Frame-Options "SAMEORIGIN" # Politique de sécurité du contenu # - pas de JS # - pas de CDN # - pas de police externe # - CSS local uniquement Header always set Content-Security-Policy "default-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; connect-src 'self' https://sillycone-village.be https://www.sillycone-village.be" # ----------------------------------------------------- # 4. Compression # ----------------------------------------------------- AddOutputFilterByType DEFLATE \ text/html \ text/plain \ text/css \ text/javascript \ application/javascript \ application/json \ application/xml \ image/svg+xml # ----------------------------------------------------- # 5. Cache navigateur # ----------------------------------------------------- ExpiresActive On # HTML : court pour faciliter les mises à jour ExpiresByType text/html "access plus 1 hour" # CSS ExpiresByType text/css "access plus 1 month" # SVG ExpiresByType image/svg+xml "access plus 1 month" # Fichiers statiques ExpiresByType application/javascript "access plus 1 month" # ----------------------------------------------------- # 6. Désactiver le listing des répertoires # ----------------------------------------------------- Options -Indexes # ----------------------------------------------------- # 7. Bloquer certains robots agressifs # ----------------------------------------------------- SetEnvIfNoCase User-Agent "MJ12bot" bad_bot SetEnvIfNoCase User-Agent "AhrefsBot" bad_bot Require all granted Require not env bad_bot