В настоящее время у меня есть настройка nginx для обслуживания контента через Varnish. Nginx слушает порт 8000, а varnish соединяет запросы пользователей от 80 до 8000.
Проблема в некоторых случаях, особенно при попытке попасть в каталог, например site.com/2010
, nginx перенаправляет запрос на site.com:8000/2010/
.
Как я могу предотвратить это?
Я нашел ответ на этот вопрос, более внимательно прочитав HttpCoreModule документы.
port_in_redirect off;
Это сохраняет порт, используемый клиентом во время перенаправления. Тесно связан server_name_in_redirect
который использует первое имя хоста для перенаправления. Поскольку я не хотел, чтобы sitename.v.myserver.com перенаправлял на sitename.com,
В моем случае nginx слушает порт 80
внутри контейнера докеров, но он сопоставлен с портом 8080
(или любой случайный порт) вне контейнера. Между ними нет обратного прокси, который может добавлять правильные заголовки для порта, а также не хочет жестко кодировать его в конфигурации nginx.
Пример неправильного редиректа:
http://localhost:8080/directory -> http://localhost/directory/
Я попытался:
server {
# ...
port_in_redirect off;
server_name_in_redirect off;
# ...
}
Но не вышло. Единственное, что сработало, это:
server {
# ...
absolute_redirect off;
# ...
}
Ручной ввод дляabsolute_redirect
говорит:
Если этот параметр отключен, перенаправления, созданные nginx, будут относительными.
Я считаю, что это более гибкий и не требует, чтобы вы где-либо жестко запрограммировали имя сервера и порт.
Если вас беспокоят перенаправления с относительными URL-адресами, проверьте этот комментарий.
Код NGINX, вероятно, использует переменную SERVER_PORT FASTCGI, чтобы определить, куда направить пользователя. SERVER_PORT будет содержать порт, который слушает nginx, так что в вашем случае это будет 8000.
Вы можете попробовать что-то подобное для тестирования:
location ~ \.php$ {
[...]
fastcgi_param SERVER_PORT 80;
}
адаптирован к вашей конфигурации. Это грязный прием, но он может помочь вам диагностировать проблему.
Для тех, у кого есть
В fastcgi_param SERVER_PORT должен быть таким же, как и интерфейс.
Итак, я установил
fastcgi_param SERVER_PORT 80;
для перенаправления на соответствующий URL из nginx.