我的 nginx 网站受 IP 范围保护,我需要在本地或通过 vpn 登录才能看到它:
geo $external_ip {
192.168.0.0/16 0;
}
…
if ($external_ip) {
return 302 https://www.different-site.com/info_explaining_to_log_in_via_vpn ;
}
…
# Normal location config for website
现在我访问我的网站,却忘记通过 VPN 登录。所以我被重定向到信息页面,该页面很好地告诉我为什么我无法访问该站点并且我必须启动我的 VPN 客户端。
我这样做。现在我再次重新输入我网站的 URL,但浏览器似乎记住了重定向并不断返回信息页面。
如果我使用 307 状态码,也会发生同样的情况。
过了一会儿,浏览器似乎忘记了重定向并再次按照我的预期运行并向我显示我的网站。
如果我简单地返回 403 也会发生同样的情况,从而有效地丢弃了我的信息页面。我这样做是因为我认为这可能是一些缓存语句。但默认的 nginx 403 页面似乎也被浏览器记住了。
有没有办法让浏览器在每次尝试时都尝试重新加载原始站点?我觉得我错过了一个重要的难题。
输出$ curl -I https://different-site.com/
:
HTTP/2 302
server: nginx/1.10.3 (Ubuntu)
date: Mon, 11 May 2020 20:07:54 GMT
content-type: text/html
content-length: 170
location: different-site.com/info_explaining_to_log_in_via_vpn
pragma: no-cache
cache-control: no-cache
更多信息:该问题仅存在于最初打开连接而没有安装 vpn 的浏览器中。启动 vpn 成功后,任何其他浏览器或 curl 运行。
更多信息 (2):我目前假设我的浏览器保持连接处于活动状态,即使启动 VPN 也会重复使用。这样,nginx 仍然会看到旧的公共 IP 并拒绝访问,直到原始连接终止。根据https://serverfault.com/questions/775617/force-nginx-to-close-connection,除非我完全禁用keepalive,否则我无法终止连接服务器端,出于性能原因我不希望这样做。所以看起来没有前进的道路。我的下一个想法是在 nginx(haproxy?)前面放一些东西,它可以根据 url 确定连接关闭。