需要缓存用于HTML文件的PHP响应

需要缓存用于HTML文件的PHP响应,php,nginx,Php,Nginx,我正在为我的JS前端使用HTML模板。当我用一个“普通”URL(如/public/templates/foo.HTML)请求HTML文件时,我会得到HTML文件,下次重新加载时,它会被缓存。如果我使用像/asset/templates?file=foo这样的URL,它将调用一个PHP脚本并返回一个“text/html”文件(通过readfile()),缓存将不再工作。如何再次启用缓存?我正在我的服务器上运行nginx 这就是我得到的: Cache-Control: private, max-ag

我正在为我的JS前端使用HTML模板。当我用一个“普通”URL(如/public/templates/foo.HTML)请求HTML文件时,我会得到HTML文件,下次重新加载时,它会被缓存。如果我使用像/asset/templates?file=foo这样的URL,它将调用一个PHP脚本并返回一个“text/html”文件(通过readfile()),缓存将不再工作。如何再次启用缓存?我正在我的服务器上运行nginx

这就是我得到的:

Cache-Control: private, max-age=900, pre-check=900
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html; charset=UTF-8
Date: Mon, 14 Sep 2015 17:13:16 GMT
Expires: Mon, 14 Sep 2015 17:28:16 GMT
Last-Modified: Sun, 13 Sep 2015 06:47:02 GMT
Pragma: no-cache
Server: nginx/1.4.6 (Ubuntu)
Transfer-Encoding: chunked
但是浏览器不会缓存它。

您有两个选项:

  • 您可以在nginx上为PHP文件配置缓存控制头。然后它们将成为可缓存的。这真是个坏主意,因为它会缓存所有PHP。鉴于PHP的动态特性,这是很少需要的,这也是nginx在默认情况下不缓存PHP响应的原因
  • 在PHP代码的开头添加以下内容:

    标头(“缓存控制:公共,必须重新验证,最大期限=86400”) 标题(“Pargma:cache”)

  • 它似乎也是特定于nginx的:将以下行添加到nginx配置中

    proxy_ignore_headers "Cache-Control" "Expires" "Pragma";
    

    否则,nginx可能会根据nginx配置(即忽略PHP脚本中的头文件)替换这些头文件。

    是否使用session_start()启动会话;这将触发pragma no缓存;标题

    您可以通过在php.ini中更改以下内容来覆盖此功能
    session.cache_limiter=公共

    session.cache\u limiter指定用于会话页的缓存控制方法。它可以是以下值之一:nocache、private、private\u no\u expire或public。默认为nocache。有关这些值的含义的信息,请参见会话缓存限制器()文档


    取自

    使用清漆:)Mhh。。。这就像在轮子上打碎一只蝴蝶。我尝试了你的第二种方法,但仍然不起作用。它仍在发送“Pragma:no-cache”Pragma是HTTP/1.0头,如果存在缓存控制,HTTP/1.1客户端将忽略它。但是,如果您想获得Pragma集,只需执行header(“Pragma:cache”);只是想把铁扔进火里:好的,我在我的问题中添加了回应标题。浏览器仍然没有缓存它。对于初学者来说,浏览器不需要遵循缓存头。他们可能只是忽略它们,并要求新的副本无论如何。为了诊断原因,您应该发布返回到浏览器的所有HTTP头。