Próbuję uruchomić wiele kontenerów dokerów, wszystkie z uruchomionym nasłuchiwaniem nginx na porcie 80, ale z różnymi mapami portów hosta na port 80 kontenerów.
W większości przypadków to działa, z wyjątkiem sytuacji, gdy nginx dokonuje przekierowania z powodu braku końcowego ukośnika.
server {
listen 80;
root /var/www;
index index.html;
location /docs {}
}
Biorąc pod uwagę powyższą konfigurację nginx i kontener dokujący z uruchomionym portem 8080 hosta zmapowanym do portu 80 kontenera, mogę uzyskać 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 ...
ale jeśli poproszę localhost: 8080 / docs, otrzymam przekierowanie do 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 ...
Jak mogę zmusić nginx do zachowania oryginalnego portu podczas przekierowania? Próbowałem spojrzeć na port_in_redirect i server_name_in_redirect, ale nie pomogły.
EDYTOWAĆ
Na podstawie https://forum.nginx.org/read.php?2,261216,261216#msg-261216 obecnie nie wydaje się to możliwe.
Odpowiedzi:
Najprostszym rozwiązaniem jest usunięcie
index
dyrektywy i nie poleganie na wyraźnych lub dorozumianych$uri/
przekierowaniach. Na przykład:To nie jest identyczne zachowanie, ponieważ całkowicie eliminuje przekierowanie. Jeśli chcesz przekierowania ukośnika końcowego, jak daje moduł indeksu, wymagane jest bardziej złożone rozwiązanie. Na przykład:
źródło
Klienci HTTP umieszczą port w nagłówku hosta. Jeśli podczas wykonywania przekierowania użyjesz oryginalnej wartości nagłówka hosta, powinna ona działać zgodnie z oczekiwaniami. Przetestowałem następujący kod i wygląda na to, że robi dokładnie to, o co prosiłeś:
źródło
Postępuj zgodnie z tą prostą poprawką
źródło
Ciekawe ... Dokładnie napotkałem ten problem i byłem w stanie go naprawić, jak sugeruje odpowiedź Richarda Smitha :
Jedyną różnicą jest to, że nie określam
index.html
?Podaj kod błędu, aby uniknąć pętli przekierowania.
Wciąż czekam na opinie od wsparcia nginx.
źródło