一个 perl 脚本使用这个 URL 创建一个下载页面
http://server/cgi-bin/oursite/script.pl?action=checkme&username=myname
标题设置为:
my $q = new CGI;
...
print $q->header(-expires => '+0s');
上面有一堆链接。这是一个:
http://server/cgi-bin/oursite/script.pl?username=myname&action=retrieve&rmime=text__plain&rfile=HM_vmK9Ah.status
(这是 文件名 构造中的 URL。) 如果用户单击此链接,目标文件将连同 header 发送到浏览器:
print "Content-type: $RMIME\n";
print "Content-Disposition: inline\n\n";
后跟该文件的文本。它应该显示。不幸的是,如果用户随后尝试使用浏览器的后退箭头,则会失败。 Firefox(例如)这样说:
文件已过期
This document is no longer available.
The requested document is not available in the browser’s cache.
As a security precaution, the browser does not automatically re-request sensitive documents.
Click Try Again to re-request the document from the website.
[Try Again]
点击浏览器中的“重新加载”按钮或消息中的“再试一次”,然后“重新发送”返回下载页面。
如果下载页面的 header 由以下方式生成:
print "Expires: +0s\n";
print "Content-type: text/html\n\n";
然后“后退”按钮按预期工作。
我不明白为什么这两种情况下的行为不同,因为除了“后退”按钮失败之外,页面显示相同(如文本/html)。有人可以解释一下吗?
一个相关的问题 - 如果浏览器被告知在使用第一个 header 方法创建的下载页面上“显示页面源”,该方法也会显示“文档已过期”消息,并且“重试”“重新发送”会显示 URL脚本提供的首页。但是首页上的“显示页面源代码”会立即显示它,而不会显示“文档已过期”消息。如果页面是用第二种标题方法创建的,那么“显示页面源代码”确实会显示当前页面的源代码。再一次,为什么不同?
谢谢。
最佳答案
print $q->header(-expires => '+0s');
这被翻译成 Expires: .. current date and time ..
这意味着响应立即过期。这意味着结果不会被缓存,因此在浏览器中返回时无法显示。
print "Expires: +0s\n";
这不会被翻译,而是按原样发送到浏览器,即:Expires: +0s
。由于 Expires
header 需要您未提供的实际日期和时间,因此该无效 header 将被忽略,并应用默认缓存策略。这意味着页面会被缓存并在浏览器中返回时可以显示。
关于perl - 哪些 http header 可以在浏览器后退按钮上抑制 "This document is no longer available."?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56674097/