Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP删除HTTP头_Php_Http Headers - Fatal编程技术网

PHP删除HTTP头

PHP删除HTTP头,php,http-headers,Php,Http Headers,我认为Apache将这些HTTP头添加到PHP脚本生成的所有响应中: Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 到期时间:1981年11月19日星期四格林威治标准时间08:52:00 缓存控制:无存储,无缓存,必须重新验证,后检查=0,预检查=0 这对于实际的动态页面来说是可行的,但是我有一些页面,虽

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

Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 到期时间:1981年11月19日星期四格林威治标准时间08:52:00 缓存控制:无存储,无缓存,必须重新验证,后检查=0,预检查=0 这对于实际的动态页面来说是可行的,但是我有一些页面,虽然是由PHP生成的,但大部分是静态的,我希望浏览器能够缓存它们

在PHP中有没有一种方法可以从响应中删除这些头,从而激活浏览器的默认缓存规则,或者如果没有,是否有任何值可以将它们设置为与它们不存在时相同的值


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

您可以通过函数从PHP手动提供HTTP头


我认为这样做应该禁用web服务器的默认头值。

对于那些特定的文件,您可以添加header()调用来设置不同的头。即
标题(“到期:.$currentDatePlus10”)

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


可以按如下方式抑制缓存的缓存: 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:-Manual他们

我没有尝试过这个,但是你可以用你的自定义标题将这些页面保存为.html文件,或者不使用它们,脚本可以在

中运行,你的代码中可能有某个地方设置了这些变量,因为我在任何地方都找不到PHP自动插入它们的位置,在我的LAMP安装中也找不到

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

正如您所说,从文档中,他们建议说
标题(“Expires:”)
替换旧的头,但
头(“缓存控制:”)在我的浏览器中变成了
缓存控制:max age=0
(所以这不是你想要做的)

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

我要检查全局配置、vhost、pr.htaccess文件或封装在
中的任何块中的
ExpiresByType
expiresbefault
指令

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


尝试查看静态资源,然后匹配规则。您可以使用这个->

计算过期时间。首先,我要检查它是否真的不是设置这些头的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>';
}
register_shutdown_函数('foo');
回声“测试”;
函数foo(){
冲洗();
$c=“headers\u list:\n”。加入(“\n”,headers\u list());
if(函数_存在('apache_响应_头')){
$c.=“\n缓存\u响应\u标题:”;
foreach(apache_response_headers()作为$k=>$v){
$c.=“\n$k=$v”;
}
}
$c.=“\n\n”;
回音',$c';
}

这是不是在你的服务器上打印了一些“有用的”?

如果你的页面不经常改变,你应该考虑使用ETAG头,比如:

这对慢速连接(如移动电话)特别有用


提示:您应该始终使用firefox插件“Live HTTP Header”检查浏览器实际加载的内容:

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

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


话虽如此,可以通过使用before
session\u start()
或设置相应的配置设置来更改默认设置。

如果可能的话,我真的想删除所有的头文件,因此,浏览器行为与未配置服务器上的正常静态文件完全相同。由于它发生在PHP环境之外,除了在Apache中进行深入研究外,最好使用另一个值进行覆盖。我通常会对静态内容使用荒谬的过期日期(读10年)来缓存内容。我担心如果我将其设置为未来10年的日期,用户实际上不会接受更改。“缓存很容易;过期很难”通常做的是在文件名中包含文件版本,并在文件版本更改时更改对该文件的引用。(如果您已经在使用php,则非常简单)。比如site.css?v=2.3或site-2.3.css,并更改版本号,以便浏览器重新缓存它。如果我将它们设置为空字符串,例如“cache Control:”,浏览器是否会将其解释为与不存在时相同的方式?您确定PHP不仅仅是添加标题行,但是会生成全新的标题吗?默认行为是用相同的名称替换现有标题,如header()的文档中所示。这正是我试图阻止的。很抱歉,您没有访问浏览器缓存卷的权限,因此您必须使用。我确定这些标题不是从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
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>';
}