I'm trying to run multiple docker containers all running nginx listening on port 80, but with different host ports mapping to the containers port 80.
For the most part this works, except for when nginx does a redirect due to missing a trailing slash.
server {
listen 80;
root /var/www;
index index.html;
location /docs {}
}
Given the above nginx config and a docker container running it with host port 8080 mapped to container port 80 I can get localhost:8080/docs/ via curl ok:
> GET /docs/ HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
* Server nginx/1.9.5 is not blacklisted
< Server: nginx/1.9.5
< Date: Sat, 28 Nov 2015 17:27:05 GMT
< Content-Type: text/html
< Content-Length: 6431
< Last-Modified: Sat, 28 Nov 2015 17:17:06 GMT
< Connection: keep-alive
< ETag: "5659e192-191f"
< Accept-Ranges: bytes
<
... html page ...
but if I request localhost:8080/docs I get a redirect to localhost/docs/
> GET /docs HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
* Server nginx/1.9.5 is not blacklisted
< Server: nginx/1.9.5
< Date: Sat, 28 Nov 2015 17:29:40 GMT
< Content-Type: text/html
< Content-Length: 184
< Location: http://localhost/docs/
< Connection: keep-alive
<
... html redirect page ...
How can I get nginx to preserve the original port when doing the redirect? I've tried looking at port_in_redirect and server_name_in_redirect but they didn't help.
EDIT
Based on https://forum.nginx.org/read.php?2,261216,261216#msg-261216 this doesn't look possible right now.
Best Answer
The simplest solution is to remove the
index
directive and not rely on explicit or implicit$uri/
redirects. For example:This isn't identical behaviour as it avoids the redirect altogether. If you wanted a trailing slash redirect like the index module gives, then a more complex solution is required. For example: