使用Slim Framework,HTTP缓存不会过期

时间:2015-04-16 14:56:31

标签: php http caching frameworks slim

我正在使用Slim框架来开发API。

我想在HTTP缓存中缓存一些请求:

$app->etag('Unique-ID')

但到期时间似乎不起作用:

$app->expires('10 seconds')

当我使用Chrome查看标题时,请先致电我获取200状态代码:确定。

第二个电话,我收到304状态代码:好的。

等待30秒。

第三个电话,我仍然得到一个304状态代码:在我的脑海里不行。

我是否因为缓存过期而无法获得200状态代码?

谢谢。

1 个答案:

答案 0 :(得分:3)

简而言之

Expires标头指示浏览器在客户端缓存中缓存内容的时间。浏览器将从客户端缓存提供内容,直到达到到期日期。

当客户端缓存过期时,浏览器将再次向服务器发送请求。请求包含If-None-Match标头,其中包含从服务器收到的先前Etag值。如果If-None-Match标头的值仍与服务器上的当前Etag值匹配,则它将以304 Not Modified回复。

当您使用EtagIf-None-Match标头并希望服务器发送更新的内容时,Etag标头的值必须更改。

更长的解释

请假设您拥有以下代码。

$app = new \Slim\Slim();

$app->get("/hello", function() use ($app){
    $app->etag("unique-etag-1");
    echo "Hello world.\n";
});

$app->run();

然后你提出请求。

$ curl --include http://localhost:8080/hello

HTTP/1.1 200 OK
Host: localhost:8080
Connection: close
X-Powered-By: PHP/5.6.2
Content-type: text/html;charset=UTF-8
Etag: "unique-etag-1"

Hello world

在后续请求中,浏览器将发送If-None-Match请求标头。此标头的值与先前收到的Etag标头的值相同。

当Slim收到请求时,它会将If-None-Match标头的值与您使用$app->etag()调用设置的值进行比较。如果这些匹配304 Not Modified将被返回。

$ curl --include --header 'If-None-Match: "unique-etag-1"' http://localhost:8080/hello

HTTP/1.1 304 Not Modified
Host: localhost:8080
Connection: close
X-Powered-By: PHP/5.6.2
Etag: "unique-etag-1"
Content-type: text/html; charset=UTF-8

如果URI的内容发生变化,或者您希望浏览器因某些其他原因重新提取内容,请更改Etag标题的值。

$app->get("/hello", function() use ($app){
    $app->etag("unique-etag-2");
    echo "Hello world.\n";
});

现在,当浏览器发出新请求时,您将收到200 OK响应。

curl --include --header 'If-None-Match: "unique-etag-1"' http://localhost:8080/hello
HTTP/1.1 200 OK
Host: localhost:8080
Connection: close
X-Powered-By: PHP/5.6.2
Content-type: text/html;charset=UTF-8
Etag: "unique-etag-2"

Hello world.