Ich versuche, mehrere Docker-Container auszuführen, auf denen alle nginx ausgeführt werden und die Port 80 überwachen, wobei jedoch unterschiedliche Host-Ports dem Container-Port 80 zugeordnet sind.
Zum größten Teil funktioniert dies, außer wenn nginx eine Umleitung durchführt, weil ein abschließender Schrägstrich fehlt.
server {
listen 80;
root /var/www;
index index.html;
location /docs {}
}
Angesichts der obigen Nginx-Konfiguration und eines Docker-Containers, auf dem der Host-Port 8080 dem Container-Port 80 zugeordnet ist, kann ich localhost: 8080 / docs / via curl ok erhalten:
> 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 ...
aber wenn ich localhost anfordere: 8080 / docs bekomme ich eine Umleitung zu 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 ...
Wie kann ich Nginx dazu bringen, den ursprünglichen Port bei der Umleitung beizubehalten? Ich habe versucht, port_in_redirect und server_name_in_redirect zu betrachten, aber sie haben nicht geholfen.
BEARBEITEN
Basierend auf https://forum.nginx.org/read.php?2,261216,261216#msg-261216 scheint dies derzeit nicht möglich zu sein.
Antworten:
Die einfachste Lösung besteht darin, die
index
Direktive zu entfernen und sich nicht auf explizite oder implizite$uri/
Weiterleitungen zu verlassen. Beispielsweise:Dies ist kein identisches Verhalten, da die Umleitung insgesamt vermieden wird. Wenn Sie eine nachgestellte Schrägstrichumleitung wünschen, wie sie das Indexmodul bietet, ist eine komplexere Lösung erforderlich. Beispielsweise:
quelle
Die HTTP-Clients setzen den Port in den Host-Header. Wenn Sie bei der Umleitung den ursprünglichen Wert des Host-Headers verwenden, sollte dieser wie erwartet funktionieren. Ich habe den folgenden Code getestet und scheint genau das zu tun, was Sie angefordert haben:
quelle
Folgen Sie einfach dieser einfachen Lösung
quelle
Interessant ... Ich bin genau auf dieses Problem gestoßen und konnte es beheben, wie aus Richard Smiths Antwort hervorgeht :
Der einzige Unterschied ist, dass ich nicht spezifiziere
index.html
?Geben Sie den Fehlercode an, um eine Umleitungsschleife zu vermeiden.
Ich warte immer noch auf das Feedback von Nginx.
quelle