【问题标题】:PHP remove HTTP headerPHP 删除 HTTP 标头
【发布时间】:2010-12-28 14:21:11
【问题描述】:

我认为 Apache 将这些 HTTP 标头添加到 PHP 脚本生成的所有响应中:

到期时间:1981 年 11 月 19 日星期四 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

这适用于实际的动态页面,但我有一些页面虽然由 PHP 生成,但大部分是静态的,我希望浏览器缓存它们。

在 PHP 中有没有办法从响应中删除这些标头,从而激活浏览器的默认缓存规则,或者如果没有,我可以将它们设置为与它们不存在等效的值吗?

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

【问题讨论】:

    标签: php http-headers


    【解决方案1】:

    您可以通过 header() 函数从 PHP 手动提供 HTTP 标头。

    我想这样做应该禁用 Web 服务器的默认标头值。

    【讨论】:

    • 如果我将它们设置为空字符串,例如“Cache-Control:”,浏览器是否会以与不存在时相同的方式解释它?
    • 你确定 PHP 不只是添加标题行,而是会生成全新的标题吗?
    • 默认行为是用相同名称替换现有标题,如 header() 的文档中所示
    【解决方案2】:

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

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

    【讨论】:

    • 如果可能的话,我真的很想完全删除标头,以便浏览器的行为与未配置服务器上的普通静态文件完全相同。
    • 因为它发生在 PHP 环境之外,没有在 Apache 中挖掘,用另一个值覆盖将是你最好的选择。我通常会为静态内容使用荒谬的过期日期(读取 10 年)来保持内容缓存。
    • 我担心如果我将其设置为 10 年后的日期,用户实际上不会接受更改。
    • “缓存很容易;过期很难”
    • 通常的做法是在文件名中包含文件版本,并在文件版本更改时更改对它的引用。 (如果您已经在使用 php,那就很容易了)。类似 site.css?v=2.3 或 site-2.3.css 并更改版本号,以便浏览器重新缓存它。
    【解决方案3】:
    header("Expires: Fri, 1 Jan 2038 05:00:00 GMT");
    

    或者在遥远的未来某个同样荒谬的时间。请记住在发送任何输出之前设置标题值,除非您正在为整个页面进行输出缓冲。

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

    【讨论】:

      【解决方案4】:

      抑制缓存的方法如下: 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() - 手动他们

      【讨论】:

      【解决方案5】:

      我还没有尝试过,但是您可能可以将此类页面保存为带有自定义标题或缺少它们的 .html 文件,并且脚本可以在

      【讨论】:

        【解决方案6】:

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

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

        正如您所说,从文档中他们建议说 header("Expires:"); 来替换旧标题,但 header("Cache-control:"); 在我的浏览器中刚刚变为 Cache-Control: max-age=0(所以这不是您想要做的)。

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

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

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

        尝试查看静态资源,然后匹配规则。你可以用这个来计算Expires offfest -> http://www.php.net/manual/en/function.header.php#93377

        【讨论】:

        • 我确定这些标头不是在 PHP 中设置的。 @"尝试查看静态资源,然后匹配规则。":这就是重点,它们没有这些标头;)
        • 让我为您简化一下,“我可以将它们设置为与它们不存在等效的值吗?”并不真地。 (空白)将由每个浏览器解释。 “我宁愿不设定自己的价值观”这是不可能的,因为您或您的主人已经有了某个地方。
        • 好的,我确定我的代码没有设置标题。显然,当您使用它的会话时,它们是由 PHP 设置的。查看我的评论@VolkerK
        【解决方案7】:

        首先我会检查它是否真的不是设置这些标头的 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>';
        }
        

        这是否会在您的服务器上打印“可用”的内容?

        【讨论】:

        • 我已经完成了研究,似乎 PHP 在使用会话函数时设置了标题。我查看了相关文档。有一些方法可以更改标头的值,但不能阻止它们被设置。
        • 实际上,将 session.cache_limit 设置为“none”(未记录的值)解决了它。见stackoverflow.com/questions/681115/…
        • 是的,我想知道哪个 PHP 开发人员认为这是一个放置它的好地方。
        • 根据文档,''(空)显然是与 session_cache_limiter 一起使用的正确值。
        • 我花了一段时间才发现这一点,但这是真的,如果 session.cache_limit 设置为 '' 以外的任何值,Cache-Control 标头将被 覆盖 PHP 在session_start.
        【解决方案8】:

        如果您的页面不经常更改,您应该考虑使用 Etag 标头,如下所示:

        https://gist.github.com/oliworx/4951478

        这对于慢速连接(如手机)尤其有用。

        提示:您应该始终使用 firefox 插件“Live HTTP headers”检查浏览器实际加载的内容:https://addons.mozilla.org/de/firefox/addon/live-http-headers/

        【讨论】:

          【解决方案9】:

          这些缓存头在您开始使用会话时发送,默认设置为“nocache”;这样可以确保每个请求都给出一致的结果。

          例如,如果您有购物车系统并且您的浏览器缓存了/add?product=xyz,它可能不会再次添加该产品;这可能不是你想要的。

          话虽如此,可以通过使用session_cache_limiter() 之前 session_start() 或设置相应的session.cache_limiter 配置设置来更改默认设置。

          【讨论】:

            猜你喜欢
            • 2014-01-27
            • 1970-01-01
            • 1970-01-01
            • 2011-05-26
            • 2018-04-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多