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