当某人访问某个网站时,我希望他设置特定的Cookie。 此类cookie是通过auth_request检查的,并且403应该最终出现在登录屏幕中(需要HTML / PHP,因此不需要auth_basic)。 成功进行身份验证后,它将重定向到“ foo.example.org”。 因此,我编写了一个配置,并在代理中完成了所有工作。
问题是:浏览器输入foo.example.org,记住先前的重定向并保持重定向到登录屏幕。
我可以更改什么,以使浏览器不重定向(不在缓存中)? 诸如“ foo.example.org?auth”之类的东西或完全具有内部auth的东西。
server {
server_name foo.example.org;
location / {
auth_request /restricted;
error_page 403 = @error403;
proxy_pass http://10.12.34.56;
resolver 127.0.0.11 ipv6=off;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
location @error403 {
return 307 /restricted;
}
location /restricted {
proxy_pass http://auth_server;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
答案 0 :(得分:1)
您返回的是307 Temporary Redirect
而不是403 Forbidden
的响应,它可能只是缓存在浏览器中,因此保持重定向。它只是在执行您要执行的操作。
无论如何,您都在为自己的生活艰难,这样做实际上要容易得多。
使用map指令检查cookie,并根据其值设置自定义变量。假设他们需要Cookie secret
才能拥有值password
才能进入:
map $cookie_secret $notloggedin {
default 1;
password 0;
}
现在$notloggedin
将始终设置为1
,除非客户端请求具有Cookie secret=password
,然后它将设置为0
,在Nginx中也等同于空/未设置。
现在,我们将该变量放入location块的if条件中。对于在场所中使用if条件的情况有些困惑,很多人会告诉您您不应该使用它们,但是the docs明确指出:
如果在某个位置,则只能在内部进行100%安全的操作 上下文是:
返回...; 重写...最后;
这样就可以了。
location / {
if ($notloggedin) {
return https://example.com/login;
}
没有cookie的人现在被重定向到登录页面。