<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ##瀏覽器的強制緩存和協商緩存 ### 強制緩存參數 1. **Cache-Control**: * **作用**:控制緩存的行為,是 HTTP/1.1 中最重要的緩存相關頭部。 * **常見指令**: * `max-age=<seconds>`: 指定資源在本地緩存中的最大存活時間。 * `no-cache`: 強制要求緩存服務器在返回資源之前驗證資源的有效性。 * `no-store`: 禁止緩存存儲和提供任何緩存版本。 * **示例**:`Cache-Control: max-age=3600` 2. **Expires**: * **作用**:指定資源的到期時間,是 HTTP/1.0 中定義的字段。 * **注意**:`Expires`是一個具體的到期日期,而`Cache-Control`中的`max-age`是一個相對時間。 ### 協商緩存參數 1. **Last-Modified**: * **作用**:服務器返回資源的最后修改時間。 * **工作原理**:瀏覽器通過`If-Modified-Since`請求頭將上次獲取資源的`Last-Modified`時間發送給服務器,服務器根據這個時間判斷資源是否有更新。 2. **ETag**: * **作用**:資源的唯一標識符(Entity Tag)。 * **工作原理**:瀏覽器通過`If-None-Match`請求頭將上次獲取資源的`ETag`發送給服務器,服務器根據這個標識符判斷資源是否有更新。 ### 區別總結 * **強制緩存**通過`Cache-Control`和`Expires`字段控制,瀏覽器直接根據這些字段判斷是否從緩存中獲取資源。 * **協商緩存**通過`Last-Modified`和`ETag`字段控制,瀏覽器通過發送上次獲取資源的標識符給服務器,由服務器判斷資源是否需要更新。 ### 圖解 ![](https://img.kancloud.cn/e0/a5/e0a5fe02377a9e0799199658d05ea94d_1226x1080.webp) ### 問答 ##### 提問:為什么html文件不需要加header頭控制,瀏覽器訪問時第二次就是304了,而php文件需要自己處理返回304,html文件的304是誰控制的? 當瀏覽器訪問一個 HTML 文件時,服務器通常會自動處理緩存控制和返回 `304 Not Modified` 狀態碼,而 PHP 文件則需要開發者手動管理緩存和條件請求。這種區別源于靜態文件和動態文件的處理方式不同。 ### HTML 文件的 304 響應 #### 1. **靜態文件的處理** HTML 文件通常被視為靜態資源,存儲在服務器的文件系統中。服務器(如 Apache、Nginx 等)在處理靜態文件時,會根據文件的時間戳(例如文件的最后修改時間 `Last-Modified`)和內容的哈希值(如 `ETag`)自動設置響應頭。 當瀏覽器第一次訪問這個 HTML 文件時,服務器會返回文件內容,并在響應頭中包含 `Last-Modified` 和/或 `ETag` 頭。瀏覽器會緩存該文件以及這些頭信息。 #### 2. **瀏覽器的緩存機制** 在隨后的請求中,瀏覽器會在請求頭中附帶 `If-Modified-Since` 或 `If-None-Match` 頭,這些頭信息中包含上次接收到的 `Last-Modified` 或 `ETag` 值。服務器會比較文件的當前時間戳或內容哈希值與請求頭中的值: - **如果文件沒有變化**(即時間戳或哈希值未變),服務器會返回 `304 Not Modified`,并且不會再次傳輸文件內容。這減少了帶寬消耗。 - **如果文件發生變化**,服務器會返回新的文件內容和狀態碼 `200 OK`。 這一切都是由服務器軟件自動處理的,開發者通常不需要干預。 ### PHP 文件的 304 響應 #### 1. **動態文件的處理** PHP 文件是動態生成的內容,每次請求時 PHP 代碼都會被執行并生成新的頁面內容。因此,PHP 文件的內容可能每次都不同,服務器無法自動確定文件是否“未修改”。 為了支持 `304 Not Modified` 響應,開發者需要在 PHP 代碼中手動實現緩存控制。具體來說: - **手動設置 `Last-Modified` 或 `ETag`**:開發者需要在 PHP 腳本中設置響應頭,例如 `Last-Modified` 和 `ETag`,以表明內容的生成時間或哈希值。 - **檢查條件請求頭**:在處理請求時,開發者需要手動檢查請求頭中的 `If-Modified-Since` 或 `If-None-Match`,并決定是否返回 `304 Not Modified`。 #### 2. **示例** 以下是一個簡單的 PHP 示例,演示如何處理 `304 Not Modified`: ```php <?php // 假設每次生成的內容都有一個固定的時間戳或哈希值 $lastModifiedTime = filemtime(__FILE__); // 這里使用腳本的修改時間作為例子 $etag = md5_file(__FILE__); // 使用文件內容的 MD5 哈希 // 設置響應頭 header("Last-Modified: " . gmdate("D, d M Y H:i:s", $lastModifiedTime) . " GMT"); header("ETag: \"$etag\""); // 檢查 If-Modified-Since 頭和 If-None-Match 頭 if ((isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lastModifiedTime) || (isset($_SERVER['HTTP_IF_NONE_MATCH']) && trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag)) { // 文件未修改,返回 304 header("HTTP/1.1 304 Not Modified"); exit; } // 文件已修改或首次請求,生成內容 echo "<html><body><h1>Hello, World!</h1></body></html>"; ?> ``` ### 總結 - **HTML 文件(靜態資源)**:服務器自動處理緩存控制和 `304 Not Modified` 響應。服務器根據文件的時間戳和內容自動生成 `Last-Modified` 和 `ETag` 頭,并在條件請求時返回 `304`。 - **PHP 文件(動態資源)**:由于每次請求可能返回不同的內容,服務器無法自動處理 `304 Not Modified` 響應。開發者需要手動設置緩存頭并根據條件請求頭決定是否返回 `304`。 這種機制有助于提高性能,減少不必要的帶寬消耗,并確保瀏覽器能夠正確緩存和更新內容。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看