All new Registrations are manually reviewed and approved, so a short delay after registration may occur before your account becomes active.
I need help understanding trailing slash behaviour in Nginx
I'm setting up nginx as a reverse proxy for squaremap (a world map viewer for Minecraft servers) and encountering unexpected behavior with trailing slashes. I've followed the squaremap documentation for serving with nginx acting as a reverse proxy (https://github.com/jpenilla/squaremap/wiki/Internal-vs-External-Web-Server), but I'm confused by the results. Here's what I've tried:
squaremap is running at 127.0.0.1:39000
Configuration:
location /squaremap { proxy_pass http://127.0.0.1:39000; }Result: Accessing
https://example.com/squaremapreturns a 404 error.location /squaremap { proxy_pass http://127.0.0.1:39000/; }Result:
https://example.com/squaremapshows a blank page, buthttps://example.com/squaremap/works fine.location /squaremap/ { proxy_pass http://127.0.0.1:39000/; }Result:
https://example.com/squaremapredirects tohttps://example.com/squaremap/and then displays the web interface.https://example.com/squaremap/works as expected.
In my attempt to figure out what was happening, I read part of the nginx documentation on proxy_pass. However, I'm not sure if my interpretation is correct. My understanding is:
- If there's no URI in the
proxy_passdirective, the request URI is passed to the upstream unchanged. - If there is a URI in the
proxy_passdirective, the part of the request matching the location directive is substituted by the value of the URI in theproxy_passdirective.
Based on this, I created a table of what I think is happening in each of the above cases:
| Case | Original Request | Request to Upstream | Result |
|---|---|---|---|
| 1 | https://example.com/squaremap |
/squaremap | Error 404 |
| 2.a | https://example.com/squaremap |
/ | White page |
| 2.b | https://example.com/squaremap/ |
// | Works |
| 3 | https://example.com/squaremap/ |
/ | Works |
My questions are:
- Is my interpretation of how nginx processes these requests correct?
- Why do I get different results in cases
2aand3, even though they seem to send the same request to the upstream? - Why doesn't it work without the trailing slash, but works with it?
- Is there a configuration that would allow both
/squaremapand/squaremap/to work correctly without a redirect?
I'd appreciate any insights into understanding this behavior and how to properly configure nginx for this use case.


Comments
I had to look at the Documentation to make sure but From what I can tell, and just follow me here Okay......You aren't once from your examples using the proper Method explained by the nginx Docs, I'm sure the third party knows what they're doing But if you want to use nginx my advice is go By their Official Documentation here is the relevant part you sort of Mentioned and then you changed the last part of their sentence "by the value of the URI" well the end part No that's not what it says know what I mean, And then there There is your configuration which is again, Not following the Official Docs which clearly as I thought show the location and the URI with examples, try following and then report back:
2a and 2b have to be the same on the backend. Maybe there is an issue with the CSS/JS path. Since your backend is not SSL, just run tcpdump, like tcpdump -i any -A -s 0 'tcp dst port 39000 and host 127.0.0.1'
For universal location, try:
location ~ ^/squaremap/?(.*)$ {
proxy_pass http://127.0.0.1:39000/$1;
}