Мы устанавливаем 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
флаг.