Nội dung

    Phản hồi máy chủ 304 Not Modified

    HTTP Status Code 304 (Not Modified)

    Mã trạng thái HTTP 304 (Not Modified) là một phản hồi từ máy chủ cho biết rằng tài nguyên được yêu cầu không thay đổi kể từ lần yêu cầu cuối cùng của khách hàng. Mã này được sử dụng để tối ưu hóa việc lưu trữ đệm, cho phép tránh việc truyền tải dữ liệu mà không thay đổi.

    304 - Not Modified

    1. Các đặc điểm chính của mã trạng thái 304

    • Định nghĩa và mục đích:

      Mã trạng thái 304 cho phép máy chủ thông báo cho trình duyệt rằng tài nguyên đã được lưu trong bộ nhớ cache và không cần phải tải lại từ máy chủ.

    • Cách thức hoạt động của cơ chế lưu trữ đệm với 304:

      Khi máy khách gửi yêu cầu với các tiêu đề như If-Modified-Since hoặc If-None-Match, máy chủ sẽ kiểm tra xem tài nguyên có được sửa đổi hay không. Nếu không, nó trả về mã 304.

    • Điều kiện mà máy chủ trả về trạng thái 304:
      • Tài nguyên đã được lưu trong bộ nhớ cache.
      • Thời gian sửa đổi của tài nguyên chưa thay đổi kể từ lần yêu cầu trước.
      • Máy khách gửi yêu cầu với tiêu đề If-Modified-Since hoặc If-None-Match.

    2. Ví dụ thực tiễn về việc sử dụng mã trạng thái 304

    • Ví dụ với lưu trữ đệm hình ảnh trên trang web:
      • Cách trình duyệt lưu trữ bộ nhớ cache:

        Trình duyệt tải hình ảnh lần đầu và lưu trữ nó trong bộ nhớ cache cùng với thông tin về thời gian sửa đổi.

      • Hành vi khi yêu cầu lại:

        Khi người dùng truy cập lại, trình duyệt sẽ gửi yêu cầu với tiêu đề If-Modified-Since, và máy chủ có thể trả về mã 304 nếu hình ảnh không thay đổi.

    • Ví dụ với API đơn giản:

      Mã 304 có thể được sử dụng để tối ưu hóa các yêu cầu đến tài nguyên. Khi một ứng dụng gửi yêu cầu lấy dữ liệu, máy chủ có thể trả về 304 nếu dữ liệu không thay đổi.

    • Ví dụ với các tiêu đề If-Modified-Since và If-None-Match:

      Các tiêu đề này cho phép máy khách yêu cầu tài nguyên chỉ khi nó đã thay đổi, giúp giảm băng thông và thời gian tải.

    3. Cách khắc phục các vấn đề với mã 304 trên các ngôn ngữ lập trình khác nhau

    1. PHP:
      • Cách thiết lập tiêu đề cho lưu trữ đệm:

        Sử dụng hàm header() để thiết lập tiêu đề cho lưu trữ đệm.

      • Ví dụ mã xử lý yêu cầu và trả về trạng thái 304:
        header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
        if (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == strtotime($last_modified)) {
            header("HTTP/1.1 304 Not Modified");
            exit;
        }
                    
    2. Python (Flask):
      • Cách thiết lập lưu trữ đệm và xử lý trạng thái 304:

        Sử dụng Flask để thiết lập các tiêu đề lưu trữ đệm.

      • Ví dụ mã kiểm tra các điều kiện lưu trữ đệm:
        from flask import Flask, request, make_response
        app = Flask(__name__)
        
        @app.route('/resource')
        def resource():
            last_modified = 'Tue, 01 Jan 2023 12:00:00 GMT'
            response = make_response('Resource data')
            response.headers['Last-Modified'] = last_modified
            if request.headers.get('If-Modified-Since') == last_modified:
                return '', 304
            return response
                    
    3. Node.js (Express):
      • Cách xử lý yêu cầu với mã trạng thái 304:

        Sử dụng Express để thiết lập tiêu đề và phản hồi với mã 304 khi cần thiết.

      • Ví dụ mã làm việc với tiêu đề If-Modified-Since:
        const express = require('express');
        const app = express();
        
        app.get('/resource', (req, res) => {
            const lastModified = new Date('2023-01-01T12:00:00Z');
            res.set('Last-Modified', lastModified.toUTCString());
            if (req.headers['if-modified-since'] === lastModified.toUTCString()) {
                return res.status(304).end();
            }
            res.send('Resource data');
        });
                    

    4. Các lỗi thường gặp và cách khắc phục

    • Thiết lập sai lưu trữ đệm trên máy chủ:

      Đảm bảo rằng các tiêu đề Last-Modified và ETag được thiết lập chính xác.

    • Lỗi trong tiêu đề yêu cầu:

      Kiểm tra các tiêu đề If-Modified-Since và If-None-Match để đảm bảo chúng được gửi đúng cách.

    • Cách kiểm tra và gỡ lỗi mã 304:

      Sử dụng các công cụ phát triển của trình duyệt để kiểm tra các phản hồi và tiêu đề HTTP.