Как мне заставить 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? Или настройки конфига я где-то пропустил?
2 ответа
Nginx не ищет HTTP_X_FORWARDED_PROTO, и это не ошибка. Это просто отсутствие такой функциональности.
Вы должны настроить свой интерфейс для настройки заголовка местоположения в ответах или заменить его другим nginx (так как сам nginx является отличным балансировщиком нагрузки и SSL-терминатором).
Похоже, что LB выполняет SSL-завершение, а nginx просто получает HTTP-запрос. Nginx не изменяет ни один из получаемых HTTP-заголовков. Вы можете сделать это, используя правила перезаписи, которые проверяют, установлен ли HTTP_X_FORWARDED_PROTO или нет, и затем соответственно переписывают запрос. К вашему сведению, nginx не поддерживает вложенные или сложные операторы "если", поэтому вам придется прибегнуть к методу, описанному в ссылке ниже.
http://rosslawley.co.uk/2010/01/nginx-how-to-multiple-if-statements/