http-headers服务器返回的首部错误码304

一、304定义

Not Modiied,意即:客户端可以通过所包含的请求首部,使其请求变成有条件的。如果客户端发起了一个有条件的GET请求,而最近资源未被修改过的话,就可以用这个状态码来说明资源未被修改。带有这个状态码的响应不应该包含主体部分。

我们要巧妙理解这这个定义,这相当于客户端和服务器端的一个条件约束,你问我要东西,我给你东西,并且我返回给你一个条件标识,(如果你发现这个标识,请你在本地缓存一下你刚才要的资源)下一次你再问我要的时候请也带着这个标识过来,我服务器端发现你带了这个标识,并且用它来检测你要的资源是否在间隔时间内有变动,如果没有变动,我直接就返回给你304,告诉你我这里没变,你直接取自己的缓存好了。这样我就没有必要把资源实体返回给你,大大节省了网络资源。

那么我们就可以用304来做一个请求图片的例子:

<?php
    $fn = './test.jpg';
    $headers = apache_request_headers();
    if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == filemtime($fn))) {
        // Client's cache IS current, so we just respond '304 Not Modified'.
        header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($fn)).' GMT', true, 304);
    } else {
        // Image not cached or cache outdated, we respond '200 OK' and output the image.
        header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($fn)).' GMT', true, 200);
        header('Content-Length: '.filesize($fn));
        header('Content-Type: image/png');
        print file_get_contents($fn);
    }

大家可以随便自己下载一个jpg的图片,然后重命名成test.jpg然后和脚本放到同一个目录下测试,多刷新几次。

你可能感兴趣的:(http-headers服务器返回的首部错误码304)