Я пытаюсь запустить несколько Docker-контейнеров, все из которых запускают nginx, прослушивая порт 80, но с разными портами хоста, сопоставленными с портом 80 контейнера.
По большей части это работает, за исключением случаев, когда nginx выполняет перенаправление из-за отсутствия завершающего слеша.
server {
listen 80;
root /var/www;
index index.html;
location /docs {}
}
Учитывая приведенную выше конфигурацию nginx и контейнер докера, на котором он работает с портом хоста 8080, сопоставленным с портом 80 контейнера, я могу получить 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 ...
но если я запрашиваю localhost: 8080 / docs, я получаю перенаправление на 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 ...
Как я могу получить nginx для сохранения исходного порта при выполнении перенаправления? Я пытался посмотреть на port_in_redirect и server_name_in_redirect, но они не помогли.
РЕДАКТИРОВАТЬ
Исходя из https://forum.nginx.org/read.php?2,261216,261216#msg-261216, это сейчас не представляется возможным.
Ответы:
Самое простое решение - удалить
index
директиву, а не полагаться на явные или неявные$uri/
перенаправления. Например:Это не идентичное поведение, поскольку оно полностью исключает перенаправление. Если вы хотели использовать редирект с косой чертой, как это дает модуль index, тогда требуется более сложное решение. Например:
источник
HTTP-клиенты помещают порт в заголовок Host. Если при перенаправлении вы используете исходное значение заголовка узла, оно должно работать как положено. Я протестировал следующий код и, похоже, выполняю именно то, что вы просили:
источник
Просто следуйте этому простому исправлению
источник
Интересно ... Я столкнулся именно с этой проблемой и смог ее исправить, как подсказывает ответ Ричарда Смита :
Разница лишь в том, что я не уточняю
index.html
?Укажите код ошибки, чтобы избежать цикла перенаправления.
Все еще жду отзывов от поддержки nginx.
источник