trouble with static content (Revised)

Francis Daly francis at
Sun Nov 7 15:07:38 UTC 2021

On Sun, Nov 07, 2021 at 08:46:17AM -0500, deeztek wrote:

Hi there,

> So when I say static content, I mean resources such as .css, .js .png, .jpg
> etc.

Ok, so let's use one "js" request as an example here.

In nginx, one request is handled in one location. Only the config in,
or inherited into, that location, matters.

The nginx error log usually has useful information; when testing
things, it can be useful to set a more-than-usual logging level, as per

> so, with the following in place:
> location ~* .(?:ico|css|js|gif|jpe?g|png|woff2|map)$ {
> expires max;
> }
> Requests to the / location, I get 404s:
> GET https://host.domain.tld/static/js/vendor.d0bc79df.js net::ERR_ABORTED
> 404 (Not Found)
> GET https://host.domain.tld/static/css/index.393eb37d.css net::ERR_ABORTED
> 404 (Not Found)

What specific response do you want to get, to those requests?

The config above says that nginx should serve something like the file
/usr/local/nginx/html/static/js/vendor.d0bc79df.js in response to the
first request. The actual response is a 404. Does that file exist?

(The 404 response suggests that the file does not exist.)

(I say "something like", because your config does not show a "root"
that is in, or inherited into, the "location ~*" block that handles
this request. So the effective "root" value is whatever the compile-time
value was, which could be anything.)

So - what file on your filesystem do you want nginx to send you, when
you make the request for /static/js/vendor.d0bc79df.js?

If you want nginx to serve /var/www/html/static/js/vendor.d0bc79df.js,
then probably your best bet is to add "root /var/www/html;" at "server"
level, outside of all "location" blocks.

> However requests to the /admin location all work.

Again, for clarity: can you show one specific request that you make
("/admin/one.js", for example) and the response that you get ("http 200
and the contents of the file /var/www/html/admin/one.js" or "http 404",
for example).

> Also I forgot to add that the following:
> root /var/www/html;
> must also be present the server block before the /admin location works,
> which I think is odd because I have the:
>  root /var/www/html/;
> in the /admin location.

Your "location /admin" has "proxy_pass", which means that "root" is
essentially ignored for every request that is handled in the /admin location.

If you have the "location ~*" block, then requests for "/admin/one.js"
are handled in that location, not in the /admin location -- so everything
in the /admin location is irrelevant for this request.

> Anyways, if I remove the following:
> location ~* .(?:ico|css|js|gif|jpe?g|png|woff2|map)$ {
> expires max;
> }
> Requests to the /admin location, I get 404s:
> GET net::ERR_ABORTED 404

If you remove that "location ~*", then a request for "/admin/fusion.css"
will be handled in your "location /admin" block, which means it will
be proxy_pass'ed to the upstream service on port 8888. It will not be
served by nginx from the filesystem.

The logs from your nginx server should show what response nginx got from
its upstream.

The logs from your port-8888 server should show why it sent that response
to nginx.

So the same question exists: what do you want nginx to do when it gets
the request for /admin/fusion.css?

Once you can write down what you want nginx to do with each request,
then it usually becomes easier to see how to tell nginx that you want
nginx to do that thing.

Good luck with it,

Francis Daly        francis at

More information about the nginx mailing list