perl - 哪些 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脚本提供的页面。但是,首页上的“显示页面源”会立即显示它,而不会显示“文档已过期”消息。如果一个页面是使用第二种标题方法创建的,那么“显示页面源”确实会显示当前页面的源。再次,为什么有区别?
谢谢你。
解决方案
打印 $q->header(-expires => '+0s');
这被翻译成Expires: .. current date and time ..
这意味着响应立即过期。这意味着结果不会被缓存,因此在返回浏览器时无法显示。
打印“过期:+0s\n”;
这不会被翻译,而是按原样发送到浏览器,即:Expires: +0s
. 由于Expires
标头需要您未提供的实际日期和时间,因此此无效标头将被忽略,而是应用默认缓存策略。这意味着页面被缓存并且可以在返回浏览器时显示。
推荐阅读
- ios - 检测转换后的 CAShapeLayer 路径上的点击
- react-redux - 为什么是 Redux,初学者为什么不使用 useContext + useReducer?
- mysql - 按组从值中减去
- javascript - 在 node.js 中处理大文件需要多长时间?
- sql - 我的嵌套子查询和 substr 函数有什么问题
- dataframe - 如何将 spark DF 保存为 CSV 文件?
- javascript - 如何使用 3 个向量(前、右、上)旋转模型
- python - 如何让我的 python 可执行文件正确打开?
- javascript - 在 Javascript 中使用闭包的函数的意外输出
- java - 添加值并插入到 setText