# ====================== # ANNU KUTE CED — Configuration Nginx # ====================== # Ce fichier est prévu pour un déploiement en deux temps : # 1. Avant le certificat SSL : le bloc :80 ci-dessous sert le site en HTTP. # C'est aussi le prérequis de `certbot --nginx` (validation sur le port 80). # À ce stade, `nginx -t` doit passer sans aucun certificat. # 2. Après `certbot --nginx` : Certbot crée le bloc 443 (SSL) et la # redirection HTTP → HTTPS automatiquement. Un bloc 443 commenté est # fourni en bas de fichier si vous préférez configurer SSL à la main. server { listen 80; server_name votre-domaine.com; root /path/to/your/site; index index.php index.html; # ====================== # SÉCURITÉ # ====================== # Bloquer l'accès aux fichiers de configuration # (les .php de includes/ sont déjà bloqués par le bloc "répertoires # sensibles" ci-dessous ; ne PAS ajouter php ici, sinon toute # l'application serait inaccessible) location ~* \.(inc|conf|config|local)$ { deny all; return 404; } # Protéger les répertoires sensibles location ~ ^/(includes|cache|docs|conf)/ { deny all; return 404; } # Bloquer les fichiers samples et backups location ~* \.(sample|bak|backup|log|tmp)$ { deny all; return 404; } # Bloquer l'accès aux fichiers cachés location ~ /\. { deny all; return 404; } # Empêcher l'exploration des répertoires autoindex off; # ====================== # RÉÉCRITURE D'URL # ====================== # Masquer l'extension .php et redirection location / { try_files $uri $uri/ @rewrite; } location @rewrite { rewrite ^/([^.]+)$ /$1.php last; } # Traitement des fichiers PHP # $request_uri est la requête ORIGINALE du client (elle ne change pas # lors des réécritures internes) : si elle contient .php, on redirige # proprement vers l'URL sans extension ; sinon (réécriture interne # @rewrite ou directive index), on sert le PHP. Cela évite la boucle # infinie /index → /index.php → /index → … location ~ \.php$ { # Ne pas rediriger les endpoints AJAX : un 301 transformerait le POST # en GET et ferait perdre le token CSRF. if ($request_uri ~ "^/ajax/") { break; } if ($request_uri ~ "^(/[^?]+)\.php") { return 301 $1$is_args$args; } include fastcgi_params; fastcgi_pass unix:/var/run/php/php8.3-fpm.sock; # Adaptez selon votre version PHP fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; } # ====================== # OPTIMISATIONS # ====================== # Le Service Worker et le manifest ne doivent pas être cachés longtemps : # le navigateur doit pouvoir détecter les nouvelles versions du site. # (location exacte = prioritaire sur les regex ci-dessous ; "expires -1" # émet Cache-Control: no-cache sans annuler les add_header de sécurité) location = /sw.js { expires -1; } location = /site.webmanifest { expires -1; } # Cache des fichiers statiques location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; access_log off; } # Compression gzip gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json; # Headers de sécurité add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; } # ====================== # HTTPS (port 443) — après obtention du certificat # ====================== # `certbot --nginx` génère automatiquement ce bloc à partir du bloc :80, # avec la redirection HTTP → HTTPS. Pour une configuration SSL manuelle, # décommentez et adaptez les chemins des certificats, en reprenant les # mêmes sections SÉCURITÉ, RÉÉCRITURE D'URL, PHP et OPTIMISATIONS que # le bloc :80 ci-dessus : # # server { # listen 443 ssl http2; # server_name votre-domaine.com; # root /path/to/your/site; # index index.php index.html; # # ssl_certificate /etc/letsencrypt/live/votre-domaine.com/fullchain.pem; # ssl_certificate_key /etc/letsencrypt/live/votre-domaine.com/privkey.pem; # # # ... reprendre ici les mêmes location que dans le bloc :80 ... # } # # # Et remplacez alors le contenu du bloc :80 par une simple redirection : # # server { # # listen 80; # # server_name votre-domaine.com; # # return 301 https://$server_name$request_uri; # # }