【问题标题】:What headers do I send to cause a PHP script's output to be cached?我发送哪些标头以导致 PHP 脚本的输出被缓存?
【发布时间】:2011-02-03 14:09:24
【问题描述】:

我正在使用 PHP 脚本向提供了允许他们访问的凭据的访问者提供图像(存储在 webroot 之外)。

我正在发送以下标头:“Content-Type”、“Last-Modified”、“Content-Length”、“Content-Disposition”(用于设置文件名)。

我合并了代码来检查$_SERVER['HTTP_IF_MODIFIED_SINCE'],如果合适,发送“HTTP/1.1 304 Not Modified”并退出。但在 Firebug 中,我注意到请求的响应标头包括:

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

每次我查看该页面时,图像似乎都在重新下载。这是不必要的;客户端缓存图像是有意义的。但我不知道我应该发送哪些额外的标题来实现这一点。我需要发送哪些标头?

编辑:这些是我最终放入脚本的标题命令:

header('Cache-Control: private, max-age=0, must-revalidate');
header('Expires: Sat, 1 Jan 2000 12:00:00 GMT');
header('Pragma:');

【问题讨论】:

标签: php http-headers


【解决方案1】:

您正在使用会话吗?这些往往会发送无缓存标头以强制每次加载新页面,或者您网站的其他部分/模块正在发送它们。

您可以尝试使用以下内容强制缓存控制标头:

header("Cache-control: max-age=3600, must-revalidate");

【讨论】:

  • 您也可以使用 Expires 标头,但是官方文档声明:如果响应包含带有 max-age 指令的 Cache-Control 字段,则该指令会覆盖 Expires 字段。
  • 这似乎有效:我的浏览器似乎正在缓存图像。不过,我在 Firebug 的响应标头中注意到了这一点:“过期:星期四,1981 年 11 月 19 日 08:52:00 GMT”。你认为这是怎么发生的,我应该担心吗?
  • 另外,是的,我正在使用会话。
  • 在某处打算进行 10 年缓存的某处可能是错误的日期转换,并且正在设置绝对 10 年期间,而不是相对期间。很难说。您必须检查服务器中的所有内容(php 和 apache),以查看缓存标头的来源。
【解决方案2】:

您可以自己发送Expires、Cache-Control 和Pragma 标头:

Expires 使用 RFC 1123 日期、格式,例如:Expires: Thu, 03 Feb 2011 15:16:16 GMT

对于缓存控制,您可以这样做:Cache-Control: public, max-age: 3600。 max-age 以秒为单位。

至于 Pragma,你可以禁用 web 服务器的 no-cache 的默认响应:

header('Pragma: ');

附言。许多网络服务器还包括一种让您告诉网络服务器处理文件的方法。

在 lighttpd 中,您可以使用 x-sendfile 标头。在 Apache 中,如果你安装了 mod_xsendfile 来做同样的事情,你可以使用它。在 nginx 中,您可以使用 X-Accel-Redirect 标头。提供静态文件实际上是网络服务器的工作,这些是您可以利用的非常方便的功能,同时仍然将您的文件隐藏在公共 docroot 区域中。对于其他网络服务器,您可以回退到自己处理发送标头以进行缓存。

【讨论】:

  • 阅读 Cache-Control 标头,听起来“私有”对我来说更合适——不是这样吗?
  • 如果一个请求可能会导致两个不同的响应,是的,但是由于您提供的是图像,我认为情况并非如此。但是,如果是,那么它确实应该是私有的。
  • 一个请求可能会导致不同的响应,具体取决于客户端是否是已提供适当凭据以查看图像的用户。
【解决方案3】:

您可以按照本文所述设置Expires 和Last-Modified:How to cache images generated by PHP

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    相关资源
    最近更新 更多