159 lines
5.3 KiB
Plaintext
159 lines
5.3 KiB
Plaintext
# ======================
|
|
# 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 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.
|
|
location ~* ^/[^/]+\.(adoc|html|pdf)$ {
|
|
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;
|
|
# # }
|