J'essaie d'exécuter plusieurs conteneurs Docker exécutant tous l'écoute nginx sur le port 80, mais avec différents ports hôte mappant sur le port 80 des conteneurs.
Pour la plupart, cela fonctionne, sauf lorsque nginx effectue une redirection en raison de l'absence d'une barre oblique de fin.
server {
listen 80;
root /var/www;
index index.html;
location /docs {}
}
Étant donné la configuration nginx ci-dessus et un conteneur docker l'exécutant avec le port hôte 8080 mappé sur le port conteneur 80, je peux obtenir 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 ...
mais si je demande localhost: 8080 / docs, je reçois une redirection vers 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 ...
Comment puis-je obtenir nginx pour conserver le port d'origine lors de la redirection? J'ai essayé de regarder port_in_redirect et server_name_in_redirect mais ils n'ont pas aidé.
ÉDITER
Basé sur https://forum.nginx.org/read.php?2,261216,261216#msg-261216, cela ne semble pas possible pour le moment.
Réponses:
La solution la plus simple consiste à supprimer la
index
directive et à ne pas s'appuyer sur des$uri/
redirections explicites ou implicites . Par exemple:Ce comportement n'est pas identique car il évite complètement la redirection. Si vous vouliez une redirection de barre oblique de fin comme le donne le module d'index, alors une solution plus complexe est requise. Par exemple:
la source
Les clients HTTP mettront le port dans l'en-tête Host. Si vous utilisez la valeur d'origine de l'en-tête d'hôte lors de la redirection, cela devrait fonctionner comme prévu. J'ai testé le code suivant et semble faire exactement ce que vous avez demandé:
la source
Suivez simplement cette solution simple
la source
Intéressant ... J'ai rencontré précisément ce problème et j'ai pu le résoudre comme le suggère la réponse de Richard Smith :
La seule différence est que je ne précise pas
index.html
?Spécifiez le code d'erreur pour éviter une boucle de redirection.
Toujours en attente des commentaires du support de nginx.
la source