http ヘッダーを要求して、Web ページが編集されているかどうかをその日付を見て確認することができますが、データベースからデータを取得する php、aspx などの動的ページはどうでしょうか?
5 に答える
時代遅れだと思うかもしれませんが、Simon Willison の条件付き GETに関する記事は、役に立つ以上のものであることがわかっています。この例は PHP で書かれていますが、非常に単純なので、他の言語に適応させることができます。これが例です:
function doConditionalGet($timestamp) {
// A PHP implementation of conditional get, see
// http://fishbowl.pastiche.org/archives/001132.html
$last_modified = substr(date('r', $timestamp), 0, -5).'GMT';
$etag = '"'.md5($last_modified).'"';
// Send the headers
header("Last-Modified: $last_modified");
header("ETag: $etag");
// See if the client has provided the required headers
$if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ?
stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) :
false;
$if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ?
stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) :
false;
if (!$if_modified_since && !$if_none_match) {
return;
}
// At least one of the headers is there - check them
if ($if_none_match && $if_none_match != $etag) {
return; // etag is there but doesn't match
}
if ($if_modified_since && $if_modified_since != $last_modified) {
return; // if-modified-since is there but doesn't match
}
// Nothing has changed since their last request - serve a 304 and exit
header('HTTP/1.0 304 Not Modified');
exit;
}
これにより、HTTP 動詞GETまたはHEADを使用できます (他の動詞でも可能だと思いますが、それらを使用する理由がわかりません)。あなたがする必要があるのは、If-Modified-Since
またはIf-None-Match
ヘッダーのそれぞれの値を追加するLast-Modified
かETag
、ページの以前のバージョンによって送信されることだけです。HTTP バージョン 1.1 の時点では よりも推奨さETag
れてLast-Modified
いますが、どちらでも機能します。
これは、条件付き GET がどのように機能するかを示す非常に単純な例です。まず、通常の方法でページを取得する必要があります。
GET /some-page.html HTTP/1.1 ホスト: example.org
条件付きヘッダーとコンテンツを含む最初の応答:
200OK ETag: あなたのETagHere
条件付き get リクエスト:
GET /some-page.html HTTP/1.1 ホスト: example.org If-None-Match: YourETagHere
また、ヘッダーのみが配信されるため、ページのキャッシュされたバージョンを使用できることを示す応答:
304 変更されていません ETag: あなたのETagHere
これにより、サーバーはページに変更がないことを通知しました。
また、条件付き GET に関する別の記事をお勧めします: RSS ハッカーのための HTTP 条件付き GET。
これはETagヘッダーの正確な目的ですが、Web フレームワークでサポートされている必要があります。または、アプリケーションがヘッダーIf-Match、If-Not-MatchおよびIf-Rangeを使用してリクエストに適切に応答するように注意する必要があります( HTTP Ch 3.11 )。
http 応答ヘッダーを正しく使用している場合は可能ですが、見過ごされがちです。
それ以外の場合は、コンテンツのローカル md5 ハッシュを保存すると便利な場合があります (フックできる簡単なコンテンツ内文字列がない限り)。これは理想的ではありませんが (プロセスが非常に遅いため)、オプションです。
はい、HTTP ヘッダーを使用してページを期限切れとしてマークすることができますし、使用する必要があります。それらが動的 (PHP、ASPX など) および/またはデータベース駆動型である場合は、手動で Expires ヘッダーの設定/HTTP Not Modified の送信を適切に制御する必要があります。ASP.NET には、このための SqlDependency オブジェクトがいくつかありますが、それでも構成および管理する必要があります。(PHP に同じようなものがあるかどうかはわかりませんが、そうでない場合はおそらく PEAR に何かがあるでしょう...)
ヘッダーは、サイトのLast-Modified
プログラマーがヘッダーを返すように明示的に設定した場合にのみ役立ちます。
通常の静的ページLast-Modified
の場合、HTML ファイルの最終変更のタイムスタンプです。動的に生成されたページの場合、リクエストに応じてコンテンツがどのように変化したかを実際に知る方法がないため、サーバーは確実にLast-Modified
値を割り当てることができません。そのため、多くのサーバーはヘッダーをまったく生成しません。
ページを制御できる場合は、Last Modified ヘッダーが設定されていることを確認すると、チェックLast-Modified
が成功することが保証されます。それ以外の場合は、ページを取得し、正規表現を実行して変更されたセクション (たとえば、ニュース サイトのヘッダーの日付/時刻) を見つける必要があります。そのような明白なマーカーが存在しない場合は、Oli のページ コンテンツの MD5 の提案を、それが変更されたことを確認する方法として 2 番目に使用したいと思います。