Назад | Перейти на главную страницу

Запретить изменение порта при перенаправлении в nginx

В настоящее время у меня есть настройка 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;
}

адаптирован к вашей конфигурации. Это грязный прием, но он может помочь вам диагностировать проблему.

Для тех, у кого есть

  • Varnish слушает порт 80
  • бэкэнд-сервер (в моем случае nginx) слушает порт 8080

В fastcgi_param SERVER_PORT должен быть таким же, как и интерфейс.

Итак, я установил

fastcgi_param  SERVER_PORT 80;

для перенаправления на соответствующий URL из nginx.