1

我的 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 确定连接关闭。

4

2 回答 2

0

试试Cache-Control: no-store吧。

从文档中no-cache

响应可以由任何缓存存储,即使响应通常是不可缓存的。但是,存储的响应必须始终在使用之前先通过源服务器的验证,因此,您不能将 no-cache 与 immutable 结合使用。如果您不想将响应存储在任何缓存中,请改用 no-store。该指令在阻止缓存存储您的响应方面无效。

于 2020-05-12T02:20:49.410 回答
0

禁用缓存响应标头是否有帮助?

add_header cache-control no-cache always;
add_header Last-Modified  "" always;
etag off;
if_modified_since off;

在我将其更改为 302 之前,当我的服务器最初发送 301 之前,我曾遇到过此问题。您还可以使用 chrome://net-internals/#dns 清除 Chrome 的 DNS 缓存,或尝试在浏览器中使用私有/隐身窗口. Firefox/Chrome 开发工具允许您禁用缓存,并且如果您重新加载 URL,则应该选择新的 Location 标头:

在此处输入图像描述

于 2020-05-11T15:45:39.147 回答