我有一个CGI脚本,它在服务器上生成一个文件,然后将浏览器重定向到新生成的文件。
#!/bin/bash
printf "Content-type: text/html\n\n";
cat /myspecialdir/foo > /httpd/foo.html
echo "<HTML><HEAD><BODY>"
echo "<META HTTP-EQUIV=\"CACHE-CONTROL\" CONTENT=\"NO-CACHE\">"
echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"1; URL=/foo.html\">"
echo "</BODY></HEAD></HTML>"
文件/ myspecialdir / foo包含一些我想要在/httpd/foo.html中的动态内容。然后,我希望脚本在生成新文件后重定向。
我遇到的问题是脚本没有从浏览器的每次点击中获取新数据。例如,如果我第一次在IE中访问http://myip/cgi-bin/genfoo.cgi,则会生成数据并将其重定向到foo.html。之后,如果我使用后退按钮进入CGI页面,它不会重新运行,我会被重定向到过时的数据。
如何强制CGI脚本甚至可以从后退按钮执行?
编辑:我尝试使用HTTP标头方法执行此操作,但这似乎不起作用。这是新脚本,我错过了什么吗?
#!/bin/bash
cat /myspecialdir/foo > /httpd/foo.txt
printf "Pragma-directive: no-cache\n\n";
printf "Cache-directive: no-cache\n\n";
printf "Cache-control: no-cache\n\n";
printf "Pragma: no-cache\n\n";
printf "Expires: 0\n\n";
printf "Location: /foo.txt\n\n";
printf "Content-type: text/html\n\n";
当我通过IE访问时,所有这一切都是在页面中打印标题,如下所示:
Pragma-directive:no-cache
Cache-directive:no-cache
缓存控制:无缓存
Pragma:no-cache
过期:0
位置:/BACtrace.txt
内容类型:text / html
修改
事实证明这是我使用的HTTP服务器的问题(busybox v1.12.1)。我无法像最初推荐的那样发送HTTP标头,但我能够使用META标签和IE8中的设置组合(工具 - &gt;互联网选项 - &gt;浏览历史记录 - &gt;设置按钮 - &gt;选中“每次访问网站时”。
我使用的META标签是:
echo "<meta http-equiv=\"expires\" content=\"0\" />"
echo "<META HTTP-EQUIV=\"Pragma-directive\" CONTENT=\"no-cache\"/>"
echo "<META HTTP-EQUIV=\"Cache-directive\" CONTENT=\"no-cache\"/>"
echo "<META HTTP-EQUIV=\"Cache-control\" CONTENT=\"no-cache\"/>"
echo "<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\"/>"
echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"1; URL=/foo.txt\"/>"
答案 0 :(得分:2)
您需要告诉浏览器(以及可能的代理)禁用使用相应HTTP标头缓存文件:
Pragma-directive: no-cache
Cache-directive: no-cache
Cache-control: no-cache
Pragma: no-cache
Expires: 0
当然,您只需在脚本中添加以下内容:
printf "Pragma-directive: no-cache\r\n";
这些指令中存在相当多的冗余。所有这些都可能没有必要,但确保所有浏览器和代理都能理解这一点是很好的。
答案 1 :(得分:2)
这不能回答你的问题,所以请放心投票,但你可以通过以下方式让自己更轻松 :
#!/bin/bash
cat /myspecialdir/foo > /httpd/foo.html
printf "Location: /foo.html\n\n";
这会向浏览器发送一个标题,告知它重定向到/foo.html
,而不必加载和解析<meta>
标记。
修改:您应该只在每个标头的末尾发送1 \n
。在整个请求之后,您发送其中的2个,如下所示(为清晰起见):
#!/bin/bash
cat /myspecialdir/foo > /httpd/foo.txt
printf "Pragma-directive: no-cache\n";
printf "Cache-directive: no-cache\n";
printf "Cache-control: no-cache\n";
printf "Pragma: no-cache\n";
printf "Expires: 0\n";
printf "Location: /foo.txt\n";
printf "\n";
(另请注意,不包括Content-Type
标头)