【问题标题】:HTTP cache not expires with Slim FrameworkSlim 框架的 HTTP 缓存不会过期
【发布时间】:2015-06-23 02:02:21
【问题描述】:

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

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

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

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

$app->expires('10 seconds')

当我使用 Chrome 查看标题时,第一次调用我得到 200 状态代码:OK。

第二次通话,我收到 304 状态码:OK。

等待 30 秒。

第三次通话,我仍然收到 304 状态代码:我认为不好。

我不应该因为缓存过期而得到 200 状态码吗?

谢谢。

【问题讨论】:

  • 你能尝试使用+10秒吗?
  • @François Lefebvre 您是否得到了 expire() 的确切答案,或者您正在使用以下答案?如果你得到了 expire() 的答案,那么请告诉我,我也面临这个问题
  • 嗨,我记得我使用了 Mika Tuupola 的回复。

标签: php http caching frameworks slim


【解决方案1】:

总之

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.

【讨论】:

  • 但是这样你应该改变Etag(并且不需要设置expires),并且OP正在谈论过期时间。因此,在此时间之后,etag 将无效,并且 slim 不会发送 304(这就是他设置 10 秒的原因)
  • 他在问为什么 Slim 在内容过期后仍然响应 304。埃塔格就是原因。 Expires 只是指示浏览器在本地缓存内容 n 秒。当内容在本地缓存时,请求甚至不会被发送到服务器(除非强制重新加载)。本地缓存过期后,浏览器再次向服务器发送请求。如果 etag 仍然匹配,则返回 304。
  • 感谢澄清,我理解错了他的问题
猜你喜欢
  • 2014-02-11
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多