HTTPヘッダーにおけるTimestamp

Last-Modified、Expires、Date、Cache-ControlなどのHTTPヘッダーでのtimestampの使い方。必須フォーマットとキャッシュ動作を詳しく解説。

Format

Last-Modified / Expires

詳細な説明

HTTPは、キャッシュ制御、条件付きリクエスト、コンテンツの鮮度管理のために、いくつかのヘッダーでtimestampを使用しています。これらのヘッダーの理解は、パフォーマンスの高いWebアプリケーションとAPIの構築に不可欠です。

主要なtimestampヘッダー:

Date: Mon, 15 Jan 2024 09:30:00 GMT
Last-Modified: Sun, 14 Jan 2024 20:00:00 GMT
Expires: Tue, 16 Jan 2024 09:30:00 GMT

すべてのHTTP timestampヘッダーは、RFC 2822フォーマットのサブセット、具体的にはRFC 7231の「推奨」フォーマット:Day, DD Mon YYYY HH:MM:SS GMTを使用します。タイムゾーンは常にGMT(この目的ではUTCと機能的に同等)でなければなりません。

各ヘッダーの動作:

Date — サーバーがレスポンスを生成した時刻。ほとんどのWebサーバーが自動的に設定します。キャッシュがレスポンスの経過時間を計算するために使用します。

Last-Modified — リソースが最後に変更された時刻。条件付きリクエストを可能にします:クライアントがこの値とともにIf-Modified-Sinceを送信し、何も変更がなければサーバーは304 Not Modifiedを返して帯域幅を節約します。

# クライアントリクエスト
GET /api/data HTTP/1.1
If-Modified-Since: Sun, 14 Jan 2024 20:00:00 GMT

# サーバーレスポンス(変更なし)
HTTP/1.1 304 Not Modified

Expires — レスポンスが古くなる時刻。この時刻以降、キャッシュは再検証が必要です。絶対的な日付の代わりに秒数で指定するCache-Control: max-ageにほぼ取って代わられています。

Cache-Control — フォーマット済み日付ではなく、相対的な秒数を使用:

Cache-Control: max-age=3600    # 1時間有効
Cache-Control: s-maxage=86400  # CDNは1日間キャッシュ可能

よくある落とし穴:

未来の日付のLast-Modified値を送信すると、キャッシュの動作が未定義になります。過去の日付のExpiresを送信すると、キャッシュにレスポンスがすでに古いことを伝えます(キャッシュの無効化のために意図的に使用されることがあります)。ExpiresCache-Control: max-ageの両方が存在する場合、max-ageが優先されます。

ETag vs. Last-Modified: 1秒に複数回変更されるリソースの場合、Last-Modifiedは変更を検出する精度が不足しています。代わりにETag(ハッシュまたはバージョン識別子)を使用してください。多くのシステムは最大限の互換性のために両方を使用しています。

ユースケース

静的アセット用のCDNを設定する際、適切なExpiresとCache-Controlヘッダーに遠い将来のtimestampを設定することで、ブラウザがアセットを長期間キャッシュし、オリジンサーバーの負荷を削減できます。

Try It — Timestamp Converter

フルツールを開く