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 経由でアクセスしたときにこれが行うことは、次のようにページのヘッダーを印刷することだけです。

プラグマ ディレクティブ: キャッシュなし

キャッシュ ディレクティブ: キャッシュなし

キャッシュ制御: キャッシュなし

プラグマ: no-cache

有効期限: 0

場所: /BACtrace.txt

コンテンツタイプ: text/html

編集:

これは、私が使用していた HTTP サーバー (busybox v1.12.1) の問題であることが判明しました。最初に推奨されたように HTTP ヘッダーを送信できませんでしたが、META タグと IE8 の設定 ([ツール] --> [インターネット オプション] --> [閲覧の履歴] --> [設定] ボタン) の組み合わせでこれを機能させることができました。 →「Web サイトにアクセスするたびに」にチェックを入れます。

私が使用した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 に答える