解决反代后静态资源直接写死404的问题

If you have Nginx in front of another webserver that's running on port 8108 and serve its content by proxy_pass of everything from a subdir, e.g. /subdir, then you might have the issue that the service at port 8108 serves an HTML page that includes resources, calls its own APIs, etc. based on absolute URL's. These calls will omit the /subdir prefix, thus they won't be routed to the service at port 8108 by nginx.

One solution is to make the webserver at port 8108 serve HTML that includes the base href attribute, e.g




which tells a client that all links are relative to that path (see https://www.w3schools.com/tags/att_base_href.asp)

Sometimes this is not an option though - maybe the webserver is something you just spin up provided by an external docker image, or maybe you just don't see a reason why you should need to tamper with a service that runs perfectly as a standalone. A solution that only requires changes to the nginx in front is to use the Referer header to determine if the request was initiated by a resource located at /subdir. If that is the case, you can rewrite the request to be prefixed with /subdir and then redirect the client to that location:

location / {

if ($http_referer = "https://example.com/subdir/") {
    rewrite ^/(.*) https://example.com/subdir/$1 redirect;
}

...

}

location /subdir/ {

proxy_pass http://localhost:8108/;

}
Or something like this, if you prefer a regex to let you omit the hostname:

if ($http_referer ~ "^https?://1+/subdir/") {

rewrite ^/(.*) https://$http_host/subdir/$1 redirect;

}


  1. /

此处评论已关闭