2

私は次のPHPファイルを持っています:

<?php

Header('Content-Type: application/javascript');

echo "// Some dynamically generated JavaScript here...";

つまり、これは.phpファイルですが、JavaScriptファイルとして解釈されます。私はそれを次のようなWebページにロードします:

<script type='text/javascript' src='myjavascript.php'></script>

私の質問は、このファイルにアクセスするときに送信されるHTTPコードに関するものです。このファイルをリクエストするたびに(直接またはリクエストしているウェブページを介して)、ChromeDevToolsのステータスは200OKと表示されます。内容が変更されていなくても、304になることはありません。

コンテンツが変更されていない場合、このような動的に生成されたファイルに対して304 Not Modifiedを取得することは可能ですか?そうでない場合、なぜですか?

私はまた、次のようなルートを可能にするいくつかのPHPフレームワークを使用しました/js/myjavascript.js。したがって、上記のコードをそのルートに配置して、同じ方法でJavaScriptを動的に生成できます。ただし、コンテンツが変更されておらず、URIが.jsファイルである場合でも、毎回200のままです。

これに対する解決策はありますか?私の状況では、このjavascript/phpファイルの内容は約1日に1回変更されます。そのため、ほとんどの場合、訪問者のブラウザでファイルをキャッシュする必要があります(304未変更)が、変更された場合は、新しいバージョン(200 OK)をダウンロードしてキャッシュするために訪問者のブラウザが必要です。

4

1 に答える 1

1

304 Not Modifiedクライアントがリクエストにヘッダーを含めた場合にのみ、ヘッダーが送信されますIf-Modified-Since

Rewrite ルールによって与えられるオプションに応じて、常に同じ一貫した出力 (たまたま image/png) を生成する PHP スクリプトがあります。私のスクリプトでは、ANYIf-Modified-Sinceがブラウザの有効なキャッシュ データを反映していると想定しているため、スクリプトには次のものが含まれます。

// If they've got it, they should use it.
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strlen($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
    header("HTTP/1.0 304 Not Modified");
    exit;
}

これについてもっと賢くしたい場合は、変数を解析して、スクリプトにとって重要なものと比較できます。実行されるたびにコンテンツを動的に生成する PHP スクリプトのコンテキストで、コンテンツが変更されたかどうかを検出する方法について考える必要があります。

PHP でブラウザーのキャッシュがどのように機能するかについての追加情報については、このコメントをPHP: header参照してください。

cURLコマンド ラインから次のコマンドを使用して、この動作をテストできます。

[ghoti@pc ~]$ curl -sL -w "%{http_code} %{url_effective}\\n" https://www.google.com/images/srpr/logo3w.png -o /dev/null
200 https://www.google.com/images/srpr/logo3w.png
[ghoti@pc ~]$ curl -H"If-Modified-Since: Sat, 31 Dec 2011 00:00:00 GMT" -sL -w "%{http_code} %{url_effective}\\n" https://www.google.com/images/srpr/logo3w.png -o /dev/null
200 https://www.google.com/images/srpr/logo3w.png
[ghoti@pc ~]$ curl -H"If-Modified-Since: Mon, 31 Dec 2012 00:00:00 GMT" -sL -w "%{http_code} %{url_effective}\\n" https://www.google.com/images/srpr/logo3w.png -o /dev/null
304 https://www.google.com/images/srpr/logo3w.png
[ghoti@pc ~]$ 

異なる日付に注意してください。

十分なヘッダーが送信されていないと Chrome で考えて問題が発生した場合は、他の人気のあるサイトが提供するヘッダーの方法を複製してみてください。

[ghoti@pc ~]$ curl -H"If-Modified-Since: Mon, 31 Dec 2012 00:00:00 GMT" -sLI https://www.google.com/images/srpr/logo3w.png
HTTP/1.1 304 Not Modified
Date: Wed, 05 Dec 2012 17:40:52 GMT
Expires: Thu, 13 Dec 2012 17:40:52 GMT
Age: 241012
Server: GFE/2.0

間違いなくServer:無視できますが、他の 3 つを含めると、Chrome からの苦情が少なくなる可能性があります。ただし、私が言ったように、動的に生成されたコンテンツをどの「年齢」と見なすかを決定するために使用する基準を考え出す必要があります.Apacheによって検出された静的ファイルのファイルシステムタイムスタンプはもはや使用できません.

于 2012-12-07T21:28:16.133 に答える