コンテンツ

    サーバー応答 304 Not Modified

    HTTP ステータスコード 304 (Not Modified) の詳細

    HTTP ステータスコード 304 は、クライアントからのリクエストに対して、要求されたリソースが最後のリクエスト以来変更されていないことを示すサーバーの応答です。このコードは、データ転送を最適化し、変更されていないデータの送信を回避するためにキャッシュ機能を利用する際に使用されます。

    304 - Not Modified

    基本的な特徴

    • 定義と目的: ステータスコード 304 は、リソースが変更されていない場合にクライアントに通知します。
    • キャッシュメカニズムの動作: クライアントは、以前に取得したリソースをキャッシュに保存し、再度リクエストする際にそのリソースが変更されていないかを確認します。
    • サーバーが 304 を返す条件: クライアントからのリクエストに「If-Modified-Since」または「If-None-Match」ヘッダーが含まれている場合、サーバーはその条件を評価します。

    実際の使用例

    1. ウェブサイトの画像キャッシュの例:
      • ブラウザは、リソースをキャッシュに保存し、次回のリクエスト時にそのリソースが変更されたかを確認します。
      • 再リクエスト時に、リソースが変更されていない場合は、サーバーは 304 を返します。
    2. API での最適化:
      • クライアントが以前のレスポンスをキャッシュしている場合、リソースが変更されていない限り、サーバーは 304 を返すことでデータ転送を削減します。
    3. If-Modified-Since および If-None-Match ヘッダーの例:
      • これらのヘッダーは、サーバーにリソースの最新状態を確認するために使用され、304 ステータスコードを引き出すために重要です。

    異なるプログラミング言語での 304 問題の修正方法

    PHP

    • キャッシュヘッダーの設定: 正しくキャッシュを設定することが重要です。
    • 304 ステータスを返すコード例:
              if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
                  $last_modified = strtotime("Wed, 21 Oct 2015 07:28:00 GMT");
                  if (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $last_modified) {
                      header("HTTP/1.1 304 Not Modified");
                      exit;
                  }
              }
              

    Python (Flask)

    • キャッシュの設定: Flask では、キャッシュメカニズムを簡単に設定できます。
    • 304 ステータスを返すコード例:
              from flask import Flask, request, jsonify
      
              app = Flask(__name__)
      
              @app.route('/resource')
              def resource():
                  last_modified = "Wed, 21 Oct 2015 07:28:00 GMT"
                  if request.headers.get('If-Modified-Since') == last_modified:
                      return '', 304
                  return jsonify({"data": "your data"}), 200
              

    Node.js (Express)

    • 304 ステータスの処理: Express でのリクエスト処理はシンプルです。
    • If-Modified-Since ヘッダーのコード例:
              const express = require('express');
              const app = express();
      
              app.get('/resource', (req, res) => {
                  const lastModified = new Date('2015-10-21T07:28:00Z').toUTCString();
                  if (req.headers['if-modified-since'] === lastModified) {
                      res.status(304).end();
                  } else {
                      res.json({ data: 'your data' });
                  }
              });
              

    一般的なエラーとその解決策

    • サーバーのキャッシュ設定ミス: サーバー側でキャッシュが適切に設定されているか確認します。
    • リクエストヘッダーのエラー: クライアント側のリクエストヘッダーが正しいかを検証します。
    • 304 ステータスの確認とデバッグ: デバッグツールを使用して、304 ステータスを正しく返しているか確認します。