2009-08-04 47 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"; 

有一個公平的雙這些指令中有冗餘。所有這些可能都沒有必要,但確保所有瀏覽器和代理都能理解的東西是很好的。