CGI脚本没有执行每个页面访问
我有一个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\"/>"
这不回答你的问题,可以随意上下投票,但你可以这样做使这个多容易对自己:
#!/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
头)
你需要告诉浏览器(以及可能的代理)禁用文件的缓存与相应的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";
有一个公平的双这些指令中有冗余。所有这些可能都没有必要,但确保所有浏览器和代理都能理解的东西是很好的。
对不起,肖恩,但是那并不是” 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
见我对细节的编辑。 – 2009-08-04 16:06:22
感谢您的澄清,肖恩。它看起来像我使用的服务器(来自旧的BusyBox的httpd)会破坏它,因为它会自动发送Content-type:text/plain标头,从而阻止我的脚本发送标头。所以,毫无疑问,我必须使用META标签。 – cigarman 2009-08-04 16:24:18