304 Not Modified issue

前端 未结 3 546
囚心锁ツ
囚心锁ツ 2021-01-07 17:38

Sorry for the probably wrong title. I am writing some code to handle If-Modified-Since and If-None-Match requests as part of caching. Everything works perfect except for tha

相关标签:
3条回答
  • 2021-01-07 17:57

    Try this code:

    $last_modified = filemtime($f);
    if(isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])) {
        $expected_modified = strtotime(preg_replace('/;.*$/','',$_SERVER["HTTP_IF_MODIFIED_SINCE"]));
        if($last_modified <= $expected_modified) {
            header("HTTP/1.0 304 Not Modified");
            exit;
        }
    }
    
    0 讨论(0)
  • 2021-01-07 17:58

    Finally solved this bug. Gzip was the culprit. Since I was gzipping the responses to If-Modified-Since and If-None-Match requests too, gzip was adding a few bytes (kind of a gzip header) to the response. Now I have stopped gzipping responses to If-Modified-Since and If-None-Match requests, and it works like a charm.

    0 讨论(0)
  • 2021-01-07 18:02

    I found the solution in Answering HTTP_IF_MODIFIED_SINCE and HTTP_IF_NONE_MATCH in PHP

    Create new file caching_headers.php

    <?php
    function caching_headers($file,$timestamp){
        $gmt_mtime=gmdate('r', $timestamp);
        header('ETag: "'.md5($timestamp.$file).'"');
        if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])||isset($_SERVER['HTTP_IF_NONE_MATCH'])){
            if ($_SERVER['HTTP_IF_MODIFIED_SINCE']==$gmt_mtime||str_replace('"','',stripslashes($_SERVER['HTTP_IF_NONE_MATCH']))==md5($timestamp.$file)){
                header('HTTP/1.1 304 Not Modified');
                exit();
            }
        }
        header('Last-Modified: '.$gmt_mtime);
        header('Cache-Control: public');
    }
    ?>
    

    and add this in all php files that you would like to cache:

    <?php
    include('caching_headers.php');
    caching_headers($_SERVER['SCRIPT_FILENAME'],filemtime($_SERVER['SCRIPT_FILENAME']));
    ?>
    
    0 讨论(0)
提交回复
热议问题