Nginx

如何防止 nginx 剝離安全 cookie?

  • August 16, 2016

我們在 cookie 上設置了secure標誌,而 nginx 拒絕傳輸它們,因為我們通過 HTTP 與它通信。

這是完全可以理解的,因為這是預期的行為。但是,在 nginx 前面,我們執行一個 Classic Load Balancer(以前稱為 Elastic Load Balancer),它接受來自 Internet 的 HTTPS 流量並通過 HTTP 與我們內部網路上的 nginx 通信。

那麼,有沒有辦法告訴 nginx 不要剝離 cookie,因為整個連接是受信任的?

好吧,首先,當您調試基於 HTTP cookie 的會話的“奇怪”問題時,請確保檢查Set-Cookie伺服器是否發送了適當的標頭!

當您確定它沒有被發送時(就像我所做的那樣),您需要將環境變數設置DEBUG*,以防您正在執行 NodeJS/express 應用程序。

如果這樣做,您可能會在日誌中發現以下行:

cookie-session 錯誤保存會話無法通過未加密的連接發送安全 cookie

然後,您將跟踪該行到cookie-session,然後進一步跟踪到cookies。當您意識到這一切都與表達不將連接視為受信任時有關。

所以 nginx 不會剝離任何 cookie。在某種程度上,這是罪魁禍首。我在負載均衡器後面的 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;

引用自:https://serverfault.com/questions/797129