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

Как запретить nginx удалять безопасные файлы cookie?

Мы устанавливаем secure флаг в наших файлах cookie, а nginx отказывается их передавать, потому что мы общаемся с ним по HTTP.

Это совершенно понятно, так как это ожидаемое поведение. Однако перед nginx мы запускаем Classic Load Balancer (ранее известный как Elastic Load Balancer), который принимает HTTPS-трафик из Интернета и общается с nginx во внутренней сети через HTTP.

Итак, есть ли способ указать nginx не удалять файлы cookie, поскольку в целом соединение является надежным?

Хорошо, во-первых, когда вы отлаживаете "странную" проблему с сеансами на основе файлов cookie HTTP, убедитесь, что Set-Cookie заголовок даже отправляется сервером!

Когда вы установили, что это не отправляется (как и я), вам нужно установить переменную среды DEBUG к *, если вы используете приложение NodeJS / express.

Если вы это сделаете, вы можете заметить в своих журналах следующую строку:

ошибка сеанса cookie сохранение сеанса Невозможно отправить безопасный файл cookie через незашифрованное соединение

Затем вы проследите эту линию до cookie-сессия а затем вниз до печенье. И тогда вы понимаете, что все это связано с тем, что явно не считает соединение надежным.

Так что nginx не зачистка любые куки. В каком-то смысле он виноват. Я нашел ответ в переменная nginx $ scheme за балансировщиком нагрузки. Процитирую принятый ответ:

# Sets a $real_scheme variable whose value is the scheme passed by the load
# balancer in X-Forwarded-Proto (if any), defaulting to $scheme.
# Similar to how the HttpRealIp module treats X-Forwarded-For.
map $http_x_forwarded_proto $real_scheme {
  default $http_x_forwarded_proto;
  ''      $scheme;
}

Вы должны поместить это в свою конфигурацию nginx, а затем использовать $real_scheme вместо того $scheme для X-Forwarded-Proto заголовок:

proxy_set_header "X-Forwarded-Proto" $real_scheme;

По умолчанию nginx не выполняет никакой обработки, связанной с secure флаг.