PHP移除HTTP头

9

我认为Apache会在PHP脚本生成的所有响应中添加以下HTTP标头:

Expires:   Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control:  no-store, no-cache, must-revalidate, post-check=0, pre-check=0

这对于实际动态页面来说效果很好,但是我有一些页面,虽然由PHP生成,但大部分是静态的,我希望浏览器将它们缓存起来。

是否可以在PHP中从响应中删除这些标头,因此激活浏览器的默认缓存规则,或者如果没有,是否可以设置等价于不存在的值?

我希望不要设置自己的值,因为我希望浏览器使用与Apache本身提供的静态资源相同的缓存规则(而不使用mod_cache)。

9个回答

7

对于那些特定的文件,您可以添加header()调用,以不同的方式设置这些标头。例如:header("Expires: " . $currentDatePlus10);

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

如果可能的话,我真的很想完全删除头文件,这样浏览器的行为就与未配置服务器上的普通静态文件完全相同。 - Bart van Heukelom
由于它发生在PHP环境之外,除了在Apache中挖掘,覆盖为另一个值可能是最好的选择。我通常会使用荒谬的到期日期(例如10年)来保持静态内容缓存。 - Myles
1
我担心如果我将其设置为未来10年的日期,更改实际上将不会被用户接收到。 - Bart van Heukelom
4
缓存很容易,但过期难。 - nickf
通常做的是在文件名中包含文件版本,并在文件版本更改时更改对该文件的引用(如果您已经使用php,则非常容易)。类似于site.css?v=2.3或site-2.3.css,然后更改版本号以便浏览器重新缓存它。 - CodeJoust

3

首先,我会检查是否有设置这些标头的PHP脚本。

register_shutdown_function('foo');
echo "test";

function foo() {
  flush();
  $c = "headers_list: \n  " . join("\n  ", headers_list());

  if ( function_exists('apache_response_headers') ) {
    $c .= "\napache_response_headers:";
    foreach( apache_response_headers() as $k=>$v) {
      $c.= "\n  $k=$v";
    }
  }
  $c .= "\n\n";
  echo '<pre>', $c, '</pre>';
}

这段代码在你的服务器上是否会输出一些“可用”的内容?


1
我已经做了研究,看起来使用会话函数时,PHP会设置标头。我查阅了相关文档,有方法可以更改标头的值,但不能防止它们被设置。 - Bart van Heukelom
2
实际上,将session.cache_limit设置为“none”(未记录的值)解决了这个问题。请参见https://dev59.com/nHRB5IYBdhLWcg3wQFLu - Bart van Heukelom
1
是啊,我想知道哪个PHP开发者决定把它放在那里会是一个好主意。 - Bart van Heukelom
2
根据文档,使用session_cache_limiter时,似乎空值''是正确的取值。 - David Oliver
我花了一些时间才发现这一点,但事实是,如果将session.cache_limit设置为除''以外的任何值,则在session_start时,PHP会覆盖Cache-Control头。 - Mahn

2
您可以通过PHP的header()函数手动提供HTTP头部。
我想这样做应该会禁用Web服务器的默认标头值。

如果我将它们设置为空字符串,例如 "Cache-Control: ",浏览器是否会像缺少时一样解释它? - Bart van Heukelom
你确定PHP不仅仅是添加头部信息,而是会生成全新的头部信息吗? - dusoft
默认行为是用相同名称替换现有的标头,就像在header()文档中所看到的那样。 - Bart van Heukelom

1
header("Expires: Fri, 1 Jan 2038 05:00:00 GMT");

在遥远的未来某个同样荒谬的时间。请记得在任何输出之前设置您的头部值,除非您正在为整个页面进行输出缓冲。

http://php.net/manual/en/function.header.php


1
这些缓存标头在启用会话时默认设置为“nocache”,以确保每个请求都提供一致的结果。例如,如果您有一个购物车系统并且您的浏览器缓存了/add?product=xyz,它可能不会再次添加该产品;这可能不是您想要的。话虽如此,默认设置可以通过在session_start()之前使用session_cache_limiter()或设置相应的session.cache_limiter配置设置来更改。

0

禁止缓存的代码如下所示: PHP代码:

header ( "Cache-Control: no-cache, must-revalidate"); / / HTTP/1.1
header ( "Expires: Mon, 1 Jul 1990 05:00:00 GMT"); / / Date in the past

如果你想要自动生成它,那么你可以在这里使用 PHP:session_cache_limiter() - 手册

这正是我试图避免的。 - Bart van Heukelom
很抱歉,您无法访问浏览器缓存卷,因此您必须使用http://at.php.net/manual/de/function.session-cache-expire.php。 - streetparade

0

你的代码中可能有设置这些变量的地方,因为我无法找到 PHP 自动插入它们的任何位置,也没有在我的 LAMP 安装中找到它们。

我的安装中唯一自动生成的标头是带有 PHP 版本的 X-Powered-By

正如你所说,从文档中推荐使用 header("Expires:"); 来替换旧标头,但是在我的浏览器中,header("Cache-control:"); 只变成了 Cache-Control: max-age=0(所以这不是你想做的)。

我建议检查这些值是否来自你已更改的框架或设置,但在不同版本的 PHP/平台上运行 PHP 可能会有所不同。

我会检查全局配置、虚拟主机、.htaccess 文件或任何封装在 <IfModule mod_expires><IfModule mod_expires.c> 中的块中是否有 ExpiresByTypeExpiresDefault 指令。

"我希望浏览器使用与 Apache 本身提供的静态资源相同的缓存规则(而不使用 mod_cache)."

尝试查看静态资源,然后匹配规则。 您可以使用此代码计算到期偏移量 -> http://www.php.net/manual/zh/function.header.php#93377


我确定这些头信息不是从PHP中设置的。@"尝试查看静态资源,然后匹配规则。":这就是问题所在,它们没有这些头信息 ;) - Bart van Heukelom
让我为你简化一下,"有没有我可以设置的值,相当于它们不存在呢?"实际上并没有。每个浏览器都会解释(blank)。"我宁愿不设置自己的值"这是不可能的,因为你或者你的主机已经有了某些值。 - Dan Beam
好的,我确信这些标头不是由我的代码设置的。然而,显然当使用PHP会话时,它们会被PHP设置。请参见我的评论@VolkerK。 - Bart van Heukelom

0

-1

我没有尝试过这个,但你可能可以将这样的页面保存为带有自定义头部或缺乏它们的 .html 文件,然后脚本可以在其中运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接