Nginx static file serving - Some files are 404, some not


#1

I have the following server configuration block:

^/(fonts/|gallery/|images/|javascripts/|stylesheets/|ajax_info.txt|apple-touch-icon.png|browserconfig.xml|crossdomain.xml|favicon.ico|robots.txt|tile-wide.png|tile.png)

{ root /var/www/html/public; access_log off; expires max;
} error_page 401 403 404 /404.html; error_page 500 502 503 504
/50x.html;}*

I want to server my static files with Nginx to my Node/Express app. I
not
want to re-factore every single route in my app, that’s why i want to
server all these static files into / URL path.

The problem is some files cannot be located on the disk, although they
existing, for example /images/art/lindon.png.

This is a docker-compose stack and nginx built from source:
https://github.com/DJviolin/lantosistvan/blob/be8e49e2302793d37ed3bfdec865f7086e579197/docker/nginx/Dockerfile

The error message that I got for a missing file:

*lantosistvan_nginx | 2016/07/06 14:24:42 [error] 6#6: *3 open()

“/var/www/html/public/images/art/lindon.png” failed (2: No such file or
directory), client: 10.0.2.2, server: localhost, request: “GET
/images/art/lindon.png HTTP/1.1”, host: “127.0.0.1”, referrer:
http://127.0.0.1/hu/blog/mariya-balazs
http://127.0.0.1/hu/blog/mariya-balazs”*

Is there any better way to server static files for the / URL without
blocking* location / {}*?

Thank You for your help!

István


#2

Sorry, the parent folder, /images/art was uncommented in .gitignore,
that’s
why didn’t uploaded into my repo. Problem solved.

Still, is there any method to share static files? Something like expose
the
public folder into / URL, but without blocking the route?

2016-07-06 14:38 GMT+02:00 Lantos István removed_email_address@domain.invalid:


#3

location / only means ‘a location which starts with /’. Basically, this
catches every single request, and is the least specific way (lowest
precedence ever) to do so.
When choosing the most suitable location block, nginx will most of the
time
use a more specific one. That is why this is called ‘default location’.

One way I understand your question:
If you want to have a specific behavior for the ‘/’ path, you could
use location
= / which matches only this exact path and has the highest precedence,
as
a match with the requested path makes this block immediately selected.

Another way:
If you want to first browse your filesystem and fall back (in case no
file
matches) to proxying the request to backends, that is not what your
current
configuraiton file tells nginx to do.
You would need something like:
location / {
try_files $uri $uri/ @fallback;
autoindex on;
}

location @fallback {

}

B. R.


#4

Check out try_files.

http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files