
server {
    root /app/public;
    server_name _;
    index index.php;
    charset utf-8;
    client_max_body_size 20M;
    port_in_redirect off;

    # Choose the connection method
    listen 0.0.0.0:80;

    # Content security headers for Laravel
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    # Gzip
    gzip on;
    gzip_vary on;
    gzip_comp_level 8;
    gzip_min_length 256;
    gzip_proxied expired no-cache no-store private auth;
    gzip_types application/javascript application/x-javascript application/xhtml+xml font/woff font/woff2 image/svg+xml image/x-icon text/css text/javascript text/plain text/xml;

    # Location configs
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # Assets and media files
    location ~* \.(?:css|js|map|scss|jpg|jpeg|png|avif|gif|mp4|woff|woff2|ico|svg|webmanifest)$ {
    	expires max;
    	access_log off;
    	add_header Cache-Control "public";
    	try_files $uri =404;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    # Error pages
    error_page 404 /index.php;
    error_page 403 /index.php;

    # PHP handling
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;

        try_files $uri /index.php;
        include fastcgi.conf;
        fastcgi_keep_conn on;
        fastcgi_intercept_errors on;
        fastcgi_index index.php;
        fastcgi_read_timeout 300;
    }
}
