【问题标题】:Browser "remembers" a temporary redirect for a while. Can I prevent that?浏览器“记住”临时重定向一段时间。我可以防止吗?
【发布时间】:2020-08-27 05:07:30
【问题描述】:

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

【问题讨论】:

  • 只是一个想法:firefox是否有可能由于连接保持活动而保持连接打开?因为如果我重新加载 nginx 就可以让它工作……
  • $ curl -I https://your-specific-url/ 的输出是什么?
  • 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: https://www.different-site.com/info_explaining_to_log_in_via_vpn pragma: no-cache cache-control: no-cache 当然,没有vpn。

标签: nginx firefox redirect http-status-code-302 http-status-code-307


【解决方案1】:

改用Cache-Control: no-store

来自no-cache的文档:

响应可以存储在任何缓存中,即使响应是 通常不可缓存。但是,存储的响应必须始终 在使用它之前首先通过原始服务器的验证, 因此,您不能将 no-cache 与 immutable 结合使用。如果 您的意思是不要将响应存储在任何缓存中, 改用无商店。该指令不能有效防止 缓存存储您的响应。

【讨论】:

  • 我通过设置 no-cache 和 no-store 以及仅设置 no-store 都试过了。两次行为都没有改变。
【解决方案2】:

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

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 标头:

【讨论】:

  • 谢谢!我添加了两个标题。 Nginx 不允许我添加 etag 和 if_modified_since,因为它们显然不允许在 location 块中。没有什么不同。
  • 另外,我可以在FF的网络选项卡中勾选“禁用缓存”复选框,它仍然会加载重定向页面。清除设置中的缓存也不能解决问题。
猜你喜欢
  • 2014-10-30
  • 1970-01-01
  • 2015-10-05
  • 2012-03-04
  • 2011-08-31
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
  • 2015-02-17
相关资源
最近更新 更多