仅当未设置 cookie 时,nginx 才会重写 URL 以重定向

仅当未设置 cookie 时,nginx 才会重写 URL 以重定向

我有两个域名 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
        }
    }

}

相关内容