首页 > 解决方案 > 哪些 http 标头要禁止“此文档不再可用”。在浏览器后退按钮上?

问题描述

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

(即 <A href="URL">filename</A> 结构中的 URL。)如果用户单击此链接,目标文件将被发送到带有标题的浏览器:

  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]

单击浏览器中的“重新加载”按钮或消息中的“重试”,然后“重新发送”返回下载页面。

如果下载页面的标题由以下方式生成:

print "Expires: +0s\n";
print "Content-type: text/html\n\n";

然后“返回”按钮按预期工作。

我不明白为什么这两种情况下的行为会有所不同,因为除了“后退”按钮失败之外,页面显示相同(如 text/html)。有人可以解释一下吗?

一个相关的问题 - 如果告诉浏览器在使用第一个标头方法创建的下载页面上“显示页面源”,也会显示“文档过期”消息,并且“重试”“重新发送”显示顶部的 URL脚本提供的页面。但是,首页上的“显示页面源”会立即显示它,而不会显示“文档已过期”消息。如果一个页面是使用第二种标题方法创建的,那么“显示页面源”确实会显示当前页面的源。再次,为什么有区别?

谢谢你。

标签: perlhttpfirefox

解决方案


打印 $q->header(-expires => '+0s');

这被翻译成Expires: .. current date and time ..这意味着响应立即过期。这意味着结果不会被缓存,因此在返回浏览器时无法显示。

打印“过期:+0s\n”;

这不会被翻译,而是按原样发送到浏览器,即:Expires: +0s. 由于Expires标头需要您未提供的实际日期和时间,因此此无效标头将被忽略,而是应用默认缓存策略。这意味着页面被缓存并且可以在返回浏览器时显示。


推荐阅读