Nginx
如何防止 nginx 剝離安全 cookie?
我們在 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;