server { listen 80; server_name _; root /usr/share/nginx/html; index index.html; # nginx:alpine ne connaît pas l'extension .mjs par défaut et la sert en # application/octet-stream -> le navigateur refuse d'exécuter le module # ES (import bloqué), ce qui fait planter silencieusement tout script # qui l'importe (constaté en prod le 2026-09-16 : browser-image- # compression.mjs importé par upload.js, page bloquée sur "Chargement..."). location ~ \.mjs$ { types { text/javascript mjs; } default_type text/javascript; try_files $uri =404; } # /e/ -> page upload invité, le slug est lu côté client via # window.location.pathname (cf. src/e/upload.js) location /e/ { try_files $uri $uri/ /e/index.html; } # /admin/?token=... -> galerie admin, slug lu côté client. # /admin/qrcode/ reste servi tel quel (fichier réel, try_files le trouve # avant de tomber sur le fallback ci-dessous). location /admin/ { try_files $uri $uri/ /admin/gallery/index.html; } location /vendor/ { try_files $uri =404; } location = / { return 302 /e/; } }