我正在使用Slim框架来开发API。
我想在HTTP缓存中缓存一些请求:
$app->etag('Unique-ID')
但到期时间似乎不起作用:
$app->expires('10 seconds')
当我使用Chrome查看标题时,请先致电我获取200状态代码:确定。
第二个电话,我收到304状态代码:好的。
等待30秒。
第三个电话,我仍然得到一个304状态代码:在我的脑海里不行。
我是否因为缓存过期而无法获得200状态代码?
谢谢。
答案 0 :(得分:3)
Expires
标头指示浏览器在客户端缓存中缓存内容的时间。浏览器将从客户端缓存提供内容,直到达到到期日期。
当客户端缓存过期时,浏览器将再次向服务器发送请求。请求包含If-None-Match
标头,其中包含从服务器收到的先前Etag
值。如果If-None-Match
标头的值仍与服务器上的当前Etag
值匹配,则它将以304 Not Modified
回复。
当您使用Etag
和If-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.