# ============================================================================== # EZSCALE catch-all server block # Traefik routes all 3 subdomains (marketing/account/admin) here. Laravel's # Route::domain() in bootstrap/app.php handles per-subdomain dispatch. # ============================================================================== server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /var/www/html/public; index index.php index.html; add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; add_header Referrer-Policy "strict-origin-when-cross-origin"; charset utf-8; location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php-upstream; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root; fastcgi_param HTTP_PROXY ""; # Match Traefik forwarded headers fastcgi_param HTTPS $http_x_forwarded_proto; fastcgi_param REMOTE_ADDR $http_x_forwarded_for; fastcgi_buffers 16 16k; fastcgi_buffer_size 32k; fastcgi_read_timeout 300; } # Deny dotfiles except .well-known (LE/CSP) location ~ /\.(?!well-known).* { deny all; access_log off; log_not_found off; } }