我有两个域名 www.domain.com 和 www.domain.com.tw。我希望将用户重定向到最近的服务器,但如果他们想查看其他服务器,他们可以通过单击站点中的链接来查看。
我尝试使用 cookie 来实现这一点,但似乎不起作用。我认为问题在于 cookie 是为引用 URL 设置的,而不是为重定向 URL 设置的,因此 nginx 甚至看不到 cookie。我该怎么做?这是我迄今为止的尝试。
server {
listen 80;
server_name www.domain.com.tw;
set $redir "";
if ($http_accept_language ~* "en") {
set $redir "1";
}
if ($http_cookie ~* "noredir") {
set $redir "";
}
if ($redir = "1") {
rewrite ^ https://www.domain.com/;
}
}
答案1
正如您自己所说,由于 cookie 依赖于域,因此 .com.tw 看不到 .com 上设置的 cookie。因此,在重定向中,您可以添加一个参数,例如?noredir=true
。然后,当 .com 收到该请求时,它无法重定向并设置 cookie,因此它会记住。
答案2
当谷歌搜索“如果缺少 cookie,nginx 会重定向”时,该页面是第二个结果。
就我而言,我想要做的就是检测 cookie 的存在,如果不存在则重定向。我不需要以任何方式与其他域共享。
此外,如果请求不是来自浏览器的 HTML 请求,我希望避免进行重定向。
http {
map $http_accept $redirectable_signal {
default "not_redirectable";
~.*text/html.* ""; # text/html requests can be redirected
}
map "$cookie_accessToken$redirectable_signal" $should_redirect {
default 0;
"" 1; # no cookie and it's a text/html request
}
server {
# ...
location / {
if ($should_redirect) {
# Your endpoint to authenticate users:
# - In my case, this redirects to an SSO/oauth provider
# - This should set an `accessToken` cookie to avoid an infinite redirect loop
return 302 /api/Authenticate?redirectScheme=$scheme&redirectHost=$host&redirectUrl=$request_uri;
}
}
location /api {
proxy_pass http://your-api.com
}
}
}