Nginx serving static files with 404 status code?
<p>I'm trying to let Nginx serve my authenticated admin users some static files with PHP. This works great, I get back the file. But it's served with a 404 status code.. </p>

<p>I'm using the following (Symfony / Silex) php code:</p>

<pre><code>use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;

$filePath = '/usr/share/nginx/project/src/path/to/my/protected/static/dir/' . $file;
if (empty($file) || !is_readable($filePath)) {
    $app-&gt;abort(404);
}

$response = new BinaryFileResponse($filePath);
$response-&gt;trustXSendfileTypeHeader();
$response-&gt;setPrivate();
$response-&gt;setContentDisposition(
    ResponseHeaderBag::DISPOSITION_INLINE,
    $file,
    iconv('UTF-8', 'ASCII//TRANSLIT', $file)
);
$response-&gt;headers-&gt;addCacheControlDirective('must-revalidate', true);
return $response;
</code></pre>

<p>And here's my nginx config:</p>

<pre><code>server {
    listen          443;
    listen          [::]:443;

    root            /usr/share/nginx/project/web;
    index           index.php;
    error_page      401 403 404 /404.html;

    server_name     example.com;

    rewrite ^/(.*)/$ /$1 permanent;

    location / {
        # First attempt to serve request as file, then
        # as directory, then let php handle the file
        try_files $uri $uri/ /index.php$is_args$args;
        index index.php;
        autoindex off;

        location ~*  \.(svg|jpg|jpeg|png|gif|ico|css|js)$ {
            expires 150d;
        }
    }

    location ~ \.php$ {
        set $path_info $fastcgi_path_info;
        fastcgi_index index.php;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;

        try_files $uri $uri/ /index.php$is_args$args;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;

        include fastcgi_params;
        fastcgi_param APP_ENV production;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}
</code></pre>

<p>The protected dir lies outside of the root in the nginx config (<code>/usr/share/nginx/project/web</code>). </p>

<p>I've found these kind of error messages in the logs:</p>

<pre><code>open() "/usr/share/nginx/project/web/admin/static/admin.js" failed 
(2: No such file or directory), 
request: "GET /admin/static/admin.js HTTP/1.1"
</code></pre>

<p>Where <code>/admin/static/admin.js</code> was indeed the requested url.</p>

<p><strong>Update 1</strong></p>

<p>It looks like nginx always tries to open the url and adds an entry to the error log even php handles the response just fine.</p>

<p>Even if I replace all the php code for just: <code>return new Response('test', 200);</code> the response code for the body 'test' is still 404... </p>

<p>I also tried adding an extra location block in my nginx config:</p>

<pre><code>location /protected_admin_files {
    internal;
    alias /usr/share/nginx/project/src/path/to/my/protected/static/dir;
}
</code></pre>

<p>And then try to redirect to the file like this:</p>

<pre><code>return new Response('', 200, [
    'X-Accel-Redirect' =&gt; '/protected_admin_files/' . $file
]);
</code></pre>

<p>But also without luck. Same 404 with the right response body... </p>