2009-08-04 48 views
1

我有一个CGI脚本在服务器上生成一个文件,然后将浏览器重定向到新生成的文件。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浏览器是打印头在页面中,像这样:

语用指令:无缓存

缓存指令:无缓存

缓存控制:无缓存

杂注:无缓存

防爆皮雷:0

地点:/BACtrace.txt

内容类型:text/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\"/>" 

回答

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头)

+0

对不起,肖恩,但是那并不是” t重定向。所做的只是在浏览器中打印“位置:/foo.html”。我错过了什么吗? 新脚本是: #!/ bin/ash cat/myspecialdir/foo> /httpd/foo.txt printf“Location:/foo.txt\r\n”; printf“Pragma-directive:no-cache \ r \ n” printf“Cache-directive:no-cache \ r \ n” printf“Cache-control:no-cache \ r \ n” printf“Pragma:无缓存\ r \ n”个 printf的 “过期:0 \ r \ n” 个 – cigarman 2009-08-04 14:35:55

+0

见我对细节的编辑。 – 2009-08-04 16:06:22

+0

感谢您的澄清,肖恩。它看起来像我使用的服务器(来自旧的BusyBox的httpd)会破坏它,因为它会自动发送Content-type:text/plain标头,从而阻止我的脚本发送标头。所以,毫无疑问,我必须使用META标签。 – cigarman 2009-08-04 16:24:18

1

你需要告诉浏览器(以及可能的代理)禁用文件的缓存与相应的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"; 

有一个公平的双这些指令中有冗余。所有这些可能都没有必要,但确保所有浏览器和代理都能理解的东西是很好的。