我有一个 nginx 服务器,它作为国际请求的代理,位于 .com 域中。
我有简单的代理配置,其中 tradernet.com 服务器将所有传入流量代理到 tradernet.ru 服务器。
我想要添加的是语言 cookie,.ru 服务器将使用它来提供正确的语言。
这是我正在做的事情:
set $language $cookie_language;
#Setting language cookie
if ($language = "") {
add_header Set-Cookie "language=en;Domain=.tradernet.com;Path=/;Max-Age=31536000";
}
如您所见,我在域名 .com 上设置了 cookie,但它没有任何效果,因为 .ru 上的服务器正在等待设置为 .tradernet.ru 域的 cookie。
如果我尝试添加带有 .ru 域的 cookie,由于某种原因它不起作用 - 我的请求被代理到根本没有语言 cookie 的 .ru 服务器。
add_header Set-Cookie "language=en;Domain=.tradernet.ru;Path=/;Max-Age=31536000";
所以问题是 - 如何在具有另一个域的代理服务器中添加 cookie?
答案1
您可以使用 proxy_cookie_domain 替换或编辑后端服务器的 cookie,请参阅 http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cookie_domain
更新:也许我应该更好地解释一下:
您已经知道,第二个 add_header 无法工作,因为浏览器不会将该 cookie 发送回 tradernet.com,因为域名设置为 .ru。至于为什么第一个对您不起作用,我无法说,因为我不明白到底是什么不起作用:
- 如果尚无语言 cookie,则不会将 Set-Cookie 发送给客户端
- Set-Cookie 部分可以工作,但是你的后端不知道如何使用它(例如,因为它期望一个 .ru 的 cookie,但却收到了一个 .com 的 cookie)
因此,我要做的是根本不使用 add_header,而是修改后端已发送的 Cookie,如果它根本不发送 cookie,则在那里实现它,然后只需使用 proxy_domain_cookie 重写 cookie。因此,如果您的后端已经设置了一个缺少语言部分的 cookie,那么类似这样的操作可能会有所帮助:
proxy_cookie_domain tradernet.ru tradernet.com;
proxy_cookie_domain ~^(.+)$ "$1; language=en";
根据您对后端逻辑的控制程度,您还可以通过添加发送到后端服务器的标头来检测语言,例如
proxy_set_header language en;