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

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

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

Однако у меня есть другой сайт, где SSL выгружается балансировщиком нагрузки. В этом случае, когда я запрашиваю https://example.com/cssnginx выдает редирект 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/

Другие вопросы по тегам