MENU

Nginx反代需要Cookie的网站

July 4, 2024 • Read: 446 • 学习·笔记

原网站http://a.com,我们反代后的网站是http://b.com
a.com需要登录认证,通过Cookie来获取授权信息。所以配置的代理网站 b.com 也需要携带Cookie。

核心配置:

server {
    listen 80;
    server_name b.com;
    location / {
        proxy_pass http://a.com;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Accept-Encoding "";

        # 需要设置原站a.com的Host
        proxy_set_header Host a.com;

        # 将原站a.com的cookie设置响应到我们自定义的域名,正常来说$host就是b.com
        proxy_cookie_domain a.com $host;

        # 这里需不需要转换看情况
        # 如果原站a.com响应的html,css,js等响应体包含了a.com,则需要加入过滤转换
        sub_filter_types *;
        sub_filter a.com $host;
        sub_filter_once off;
    }
}

特殊情况:原站是https,也就是https://a.com,会遇到Cookie无法设置,提示:This attempt to set a Cookie was blocked because it had the 'Secure' attribute but was not received over a secure connection.
出现这种情况的原因是a站点是https,cookie响应了 secure 字段,我们的b网站是http的,浏览器拒绝设置cookie。
最简单的一种解决办法是将代理网站 b.com 也改成https加上ssl的配置即可。(ssl配置可以参考其他网上博文教程,这里不做讨论)

如果我们仍然要b.com是http而已。我们可以使用 proxy_cookie_flags 指令过滤掉 Secure 即可(nginx 版本 1.19.3后)。
例如Cookie设置响应头:

Set-Cookie: cookie_name=this_is_an_example_cookie_value; Secure; HttpOnly; Path=/abc

修改后核心配置:

proxy_cookie_domain a.com $host;
proxy_cookie_flags cookie_name nosecure; 

参考:
https://stackoverflow.com/questions/41628020/nginx-remove-secure-flag-to-cookies-from-proxied-server

nginx 1.19.5版本


本文由 ONE 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
如有版权疑问交流,请给我留言:oneisall8955@gmail.com
本文永久链接:http://liuzhicong.cn/index.php/study/nginx-proxy-aws-opensearch.html

Archives QR Code Tip
QR Code for this page
Tipping QR Code