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

Как заставить nginx выдавать 301 запрос к местоположению HTTPS, когда SSL обрабатывается балансировщиком нагрузки?

Я заметил, что в nginx по умолчанию включена функция, при которой в запрос URL без косой черты для каталога, который существует в файловой системе, автоматически добавляется косая черта через 301 перенаправить.

Например. если каталог css существует в моем корне, затем запрашивает http://example.com/css приведет к 301 к http://example.com/css/.

Однако у меня есть другой сайт, где SSL разгружается балансировщиком нагрузки. В этом случае, когда я прошу https://example.com/css, nginx выдает 301 редирект на http://example.com/css/, несмотря на то, что HTTP_X_FORWARDED_PROTO заголовок установлен на https балансировщиком нагрузки.

Это ошибка nginx? Или я где-то пропустил настройку конфигурации?

Похоже, LB выполняет завершение SSL, а nginx просто получает HTTP-запрос. Nginx не изменяет ни один из получаемых HTTP-заголовков. Вы можете сделать это с помощью правил перезаписи, которые проверяют, установлен ли HTTP_X_FORWARDED_PROTO или нет, а затем соответственно перезаписывают запрос. FYI nginx не поддерживает вложенные или сложные операторы «если», поэтому вам придется прибегнуть к методу, описанному в ссылке ниже.

http://rosslawley.co.uk/2010/01/nginx-how-to-multiple-if-statements/

Nginx не ищет HTTP_X_FORWARDED_PROTO, и это не ошибка. Просто отсутствие такого функционала.

Вы должны настроить свой интерфейс для настройки заголовка местоположения в ответах, или замените его другим nginx (поскольку сам nginx является отличным балансировщиком нагрузки и SSL-терминатором).