server { listen 80; server_name _; root /var/www/app/public; index index.php; # ── En-têtes de sécurité HTTP ──────────────────────────────────────────── # Empêche le chargement de la page dans une iframe (clickjacking) add_header X-Frame-Options "SAMEORIGIN" always; # Désactive le sniffing MIME : le navigateur respecte le Content-Type déclaré add_header X-Content-Type-Options "nosniff" always; # Limite les informations transmises dans le Referer aux pages externes add_header Referrer-Policy "strict-origin-when-cross-origin" always; # Désactive les fonctionnalités navigateur non utilisées add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always; # Fichiers statiques servis directement par Nginx, sans passer par PHP. # expires 1y active le cache navigateur longue durée. location ~* \.(css|js|ico|png|jpg|jpeg|gif|svg|webp|woff2)$ { try_files $uri =404; expires 1y; access_log off; } # Bloquer l'exécution de PHP dans le répertoire des uploads. location ~* /media/.*\.php$ { deny all; } # Front controller Slim : toute URL sans fichier correspondant # est renvoyée vers index.php pour être traitée par le routeur. location / { try_files $uri $uri/ /index.php$is_args$args; } # PHP-FPM via réseau Docker interne (port 9000 par défaut). location ~ \.php$ { fastcgi_pass app:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; # Transmet les en-têtes du reverse proxy amont (Caddy hôte, etc.) # pour que l'application connaisse l'IP réelle du client et le protocole. fastcgi_param HTTP_X_FORWARDED_FOR $proxy_add_x_forwarded_for; fastcgi_param HTTP_X_FORWARDED_PROTO $http_x_forwarded_proto; } # Bloquer l'accès aux fichiers sensibles. location ~ /\.(env|git|htaccess) { deny all; } }