2

我有一个 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:无缓存

缓存指令:无缓存

缓存控制:无缓存

Pragma:无缓存

过期:0

位置:/BACtrace.txt

内容类型:文本/html

编辑:

事实证明这是我使用的 HTTP 服务器(busybox v1.12.1)的问题。我无法按照最初的建议发送 HTTP 标头,但我能够通过 META 标记和 IE8 中的设置(工具--> Internet 选项--> 浏览历史记录--> 设置按钮- -> 勾选“每次访问网站”)。

我使用的 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\"/>"
4

2 回答 2

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";

这些指令中有相当多的冗余。所有这些可能都不是必需的,但最好确保所有浏览器和代理都能理解。

于 2009-08-04T13:38:33.627 回答
2

这不能回答您的问题,因此请随意投反对票,但您可以通过以下方式让自己轻松:

#!/bin/bash

cat /myspecialdir/foo > /httpd/foo.html

printf "Location: /foo.html\n\n";

这会向浏览器发送一个标头,告诉它重定向到/foo.html而不是加载和解析<meta>标签。

编辑:您应该只\n在每个标题的末尾发送 1 。在整个请求之后,您发送其中的 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不包括标题)

于 2009-08-04T13:38:44.767 回答