Écrasement Nginx Sur la voiture du docteur lorsque le port hôte! = Conteneur portuaire

J'essaie de courir plusieurs contenants de quai, ce qui fonctionne avec nginx, Port d'écoute 80, Mais avec la comparaison de différents ports de l'hôte avec le port 80 Conteneurs.

Pour la plupart, cela fonctionne, à l'exception des cas où nginx Effectue la redirection due à l'absence de slash finale.

server {
listen 80;
root /var/www;
index index.html;
location /docs {}
}

Considérant la configuration ci-dessus nginx et le conteneur Docker qui le démarre avec le port hôte 8080, par rapport au port du conteneur 80, je peux obtenir localhost: 8080 / docs / de l'autre côté 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 la redirection 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: [url=http://localhost/docs/]http://localhost/docs/[/url]
< Connection: keep-alive
<
... html redirect page ...

Comment puis-je avoir nginx Enregistrez le port source 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é
https://forum.nginx.org/read.php?2,261216,261216#msg-261216
Cela ne semble pas possible maintenant.
Invité:

Alice

Confirmation de:

Clients HTTP Placez le port dans le titre Host. Si vous utilisez la valeur du titre d'hôte d'origine lors de la redirection, cela devrait fonctionner correctement. J'ai testé le code suivant et semble exécuter exactement ce que vous avez demandé:

location ~ ^.*[^/]$ {
try_files $uri @rewrite;
}
location @rewrite {
return 302 $scheme://$http_host$uri/;
}

> GET /bla HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 302 Moved Temporarily
< Server: nginx/1.9.7
< Date: Sun, 29 Nov 2015 06:23:35 GMT
< Content-Type: text/html
< Content-Length: 160
< Connection: keep-alive
< Location: [url=http://localhost:8080/bla/]http://localhost:8080/bla/[/url]

Catherine

Confirmation de:

La solution la plus simple - Effacer

index

directives et ne pas compter sur explicite ou implicite

$uri/

Redirection. Par exemple:

server {
listen 80;
root /var/www;
location /docs {
try_files $uri $uri/index.html =404;
}
}

Ce n'est pas un comportement identique car il élimine complètement la redirection. Si vous devez rediriger à la fin de la fonctionnalité oblique, comme dans le module d'index, une solution plus complexe est requise. Par exemple:

server {
listen 80;
root /var/www;
location /docs {
try_files $uri @redirect;
}
location @redirect {
if ($uri ~* ^(.+)/$) { rewrite ^ $uri/index.html last; }
if (-d $document_root$uri) { return $scheme://$host:8080$uri/; }
return 404;
}
}

Christine

Confirmation de:

Suivez simplement cette solution simple

location /app {
alias /usr/share/nginx/html/folder;
if (-d $request_filename) {
rewrite [^/]$ $scheme://$http_host$uri/ permanent;
}
}

Blanche

Confirmation de:

Intéressant ... J'ai rencontré ce problème et j'ai pu résoudre ce problème comme
https://serverfault.com/a/739568/488499
Des offres:

root /var/www;
location = /docs {
try_files $uri $uri/ =404;
}

La seule différence est que je ne spécifie pas

index.html

?

Spécifiez le code d'erreur pour éviter le cycle de redirection.

En attente de rétroaction du service d'assistance nginx.

Hannah

Confirmation de:

Je pense que ça se passe parce que votre Docker est un peu NAT / Proxy pour votre conteneur nginx. Pour le routage entre différents ports, des informations supplémentaires sont nécessaires.

Pour moi, il a été décidé d'ajouter ce qui suit dans nginx.conf

http {
...
proxy_set_header Host $http_host; # required for docker client's sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
...
}

Pour répondre aux questions, connectez-vous ou registre