server { listen 80; server_name localhost; root /usr/share/nginx/html; index index.html; # Els escàners automatitzats demanen milers de paths de WordPress/PHP que # aquí no existeixen. Amb el `try_files` de sota rebien l'index.html del SPA # amb codi 200, cosa que interpreten com "el fitxer hi és" i els fa insistir. # Retornant 404 marxen abans. location ~* \.(php|php[0-9]?|phtml|asp|aspx|jsp|cgi|pl|py|sh|bak|old|sql|swp|tar|gz|zip)$ { return 404; } # Fitxers ocults (.env, .git/, .htaccess...). S'exclou /.well-known, que és # legítim (ACME i altres) encara que normalment el resolgui el proxy de davant. location ~ /\.(?!well-known) { return 404; } # Proxy a backend per a ús sense Caddy (Docker local). # Quan hi ha Caddy davant, /api/ no arriba mai aquí: Caddy ja l'enruta abans. location /api/ { proxy_pass http://backend:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location / { try_files $uri $uri/ /index.html; } }