CGI脚本不执行每个页面访问

时间:2009-08-04 13:33:52

标签: cgi cgi-bin

我有一个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\"/>"

2 个答案:

答案 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标头)