'Nginx is not serving any files and just falls back to index.php which does load

getting a little confused, a test directory structure:

/usr/share/nginx/html/public:
    index.php - uses rewrite
    test.html

When i access example.com/test.html it returns 404, but index.php loads up the application with the rewrite rules all working perfectly.

I really don't understand what is happening when the test.html file exists in the same folder as index.php, so shouldn't try_files $uri pick that up?

Here is the nginx config:

server {
        listen 80;
        root /usr/share/nginx/html/public;
        server_name example.com;

        location / {
            try_files $uri $uri/ /index.php$is_args$args;
            #try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
            fastcgi_next_upstream_timeout 10s;
            fastcgi_next_upstream_tries 2;
            fastcgi_pass localhost:9000;
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            include fastcgi_params;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            internal;
            fastcgi_buffers 8 16k;
            fastcgi_buffer_size 32k;
        }

        # deny access to apache .htaccess
         location ~ /\.ht {
             deny all;
         }

         error_log /usr/share/nginx/logs/error.log;
         access_log /usr/share/nginx/logs/access.log;
    }

EDIT

Before this part is executed there is a reverse proxy before it which is configured like this:

server {
        listen 443 ssl;
        ssl_certificate /usr/local/etc/ssl/certs/live/example.com/cert.pem;
        ssl_certificate_key /usr/local/etc/ssl/certs/live/example.com/privkey.pem;
        ssl_session_timeout 10m;
        ssl_verify_client off;
        server_name example.com;
        error_log /usr/share/nginx/logs/error-api.log;
        access_log /usr/share/nginx/logs/access-api.log;

        location / {
            proxy_next_upstream error timeout http_502;
            proxy_next_upstream_tries 10;
            proxy_pass http://api;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_ssl_session_reuse on;
            proxy_set_header Origin https://gofollow.vip;
            proxy_hide_header Access-Control-Allow-Origin;
            add_header Access-Control-Allow-Origin $http_origin;
            proxy_set_header Referer $host:$server_port;
            proxy_http_version 1.1;
            proxy_set_header X-XSS-Protection 1;
            proxy_set_header X-Content-Type-Options nosniff;
            proxy_set_header Referrer-Policy origin;
            proxy_set_header X-Frame-Options DENY;
            proxy_buffering on;
            proxy_cache STATIC;
            proxy_cache_valid 200 1d;
            proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;



        }
    }

Here is the output of a curl request to the test.html file via the reverse proxy, i have replaced domain with example.com and ip with 111.11.111.111:

*   Trying 111.11.111.111:443...
* Connected to example.com (111.11.111.111) port 443 (#0)
* ALPN, offering http/1.1
* TLSv1.0 (OUT), TLS header, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS header, Finished (20):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS header, Finished (20):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: CN=example.com
*  start date: May 20 12:10:16 2022 GMT
*  expire date: Aug 18 12:10:15 2022 GMT
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
> GET /test.html HTTP/1.1
> Host: example.com
> User-Agent: curl/7.82.0
> Accept: */*
> 
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* Mark bundle as not supporting multiuse
< HTTP/1.1 404 Not Found
< Server: nginx/1.21.6
< Date: Sat, 21 May 2022 11:00:16 GMT
< Content-Type: text/html; charset=UTF-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< X-Powered-By: PHP/7.4.29
< Cache-Control: no-cache, private
< X-Frame-Options: DENY
< X-XSS-Protection: 1
< X-Content-Type-Options: nosniff
< Referrer-Policy: origin
< Strict-Transport-Security: max-age=31536000; includeSubDomains
< Access-Control-Expose-Headers: link
< 
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <meta name="robots" content="noindex,nofollow,noarchive" />
    <title>An Error Occurred: Not Found</title>
    <style>body { background-color: #fff; color: #222; font: 16px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; margin: 0; }
.container { margin: 30px; max-width: 600px; }
h1 { color: #dc3545; font-size: 24px; }
h2 { font-size: 18px; }</style>
</head>
<body>
<div class="container">
    <h1>Oops! An Error Occurred</h1>
    <h2>The server returned a "404 Not Found".</h2>

    <p>
        Something is broken. Please let us know what you were doing when this error occurred.
        We will fix it as soon as possible. Sorry for any inconvenience caused.
    </p>
</div>
</body>
* Connection #0 to host example.com left intact
</html>%                 

           


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source