server { listen 80; server_name _; root /usr/share/nginx/html; index index.html; # Pas de version nginx dans les en-têtes/pages d'erreur (surface de # reconnaissance en moins). server_tokens off; # RGPD / sécurité : les liens magiques (`/connexion?token=…`, un jeton de # connexion à usage unique) et le lien d'inscription partagé par la # coordination (`/inscription/`, voir CLAUDE.md § 2, # `FormTemplate`) transitent tous les deux par cette route. Pas de # journal d'accès ici — un jeton en clair dans un log de conteneur # serait un vrai moyen de se connecter à la place de quelqu'un (ou de # deviner le lien d'inscription) pendant sa durée de vie. access_log off; # Postures de base pour une appli publique : pas de sniffing de type MIME, # jamais dans une frame étrangère (l'appli n'a aucune raison d'y être), # et un Referer minimal vers les tiers (police Google Fonts) — l'URL # complète (avec un éventuel ?token=) ne doit jamais leur être transmise. add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "DENY" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; # Fichiers hachés par Vite (contenu du nom = jamais modifiés une fois # publiés) : cache long côté navigateur. location /assets/ { add_header Cache-Control "public, max-age=31536000, immutable"; } # Application monopage (react-router-dom) : toute route inconnue du # serveur retombe sur index.html, le routeur prend le relais côté client. location / { try_files $uri $uri/ /index.html; } }