2009-12-21 107 views
9

的东西,我认为Apache,将这些HTTP报头由PHP脚本生成的所有响应: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)相同的缓存规则。

回答

2

首先我会检查它是否真的不是设置这些头文件的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在使用会话函数时设置了标题。有些方法可以改变标题的值,但不能阻止它们被设置。 –

+2

其实,将session.cache_limit设置为“none”(无证的值)可以解决它。参见http://stackoverflow.com/questions/681115/cache-control-header-modified-by-php-session –

+0

哇,我不会想到那么久了;-) – VolkerK

2

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

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

+0

如果我将它们设置为空字符串,例如“Cache-Control:”,浏览器是否会以与缺少时相同的方式来解释? –

+0

你确定PHP不只是添加标题行,而是会生成全新的标题? – dusoft

+0

默认行为是用相同的名称替换现有的头文件,如头文件中所示() –

7

对于那些特定的文件,你可以添加header()调用来设置不同的标题。即。 header("Expires: " . $currentDatePlus10);

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

如果可能,我真的想完全删除头文件,以便浏览器行为与普通静态文件完全相同在未配置的服务器上。 –

+0

由于它发生在PHP环境之外,缺乏在Apache中进行挖掘,因此用其他值覆盖将是您最好的选择。我通常会对静态内容使用荒谬的过期日期(阅读10年)来保持内容缓存。 – Myles

+1

我担心如果将其设置为将来10年的日期,则更改实际上不会被用户接收。 –

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

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

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

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() - 手动他们

+0

这正是我试图阻止 –

+0

很抱歉,但你没有访问浏览器缓存卷,所以你必须使用http://at.php.net/manual/de/function.session-cache- expire.php – streetparade

-1

我还没有试过这个,但是你可能会把这样的页面保存为.html文件与你自定义的头文件或者缺少它们,脚本可以在

0

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

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

正如你所说的,他们建议用header("Expires:");代替旧的标题,但在我的浏览器中header("Cache-control:");刚成为Cache-Control: max-age=0(所以这不是你要做的)。

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

我会检查ExpiresByTypeExpiresDefault在全局配置,虚拟主机,公关指令。htaccess的文件或包裹在<IfModule mod_expires><IfModule mod_expires.c>

任何块“我希望浏览器使用相同的缓存规则,作为由阿帕奇本身提供服务(不使用mod_cache的)静态资源。”

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

+0

我确定头文件不是在PHP中设置的。 @“试着看一下静态资源,然后再匹配规则。”:就是这一点,他们没有这些标题;) –

+0

让我为你做这个更简单, “有没有我可以设置它们的任何值这相当于他们缺席?“ 不是真的。(空白)将各浏览器interpretted。 ‘我不希望把我自己的价值观’ 这是不可能的,因为你或你的主机已经有地方。 –

+0

好吧,我是一定的头文件不是由我的代码设置的,显然,当你使用它的会话时,它们是由PHP设置的。查看我的评论@VolkerK –

1

当你开始使用会话和这些缓存头被送到设置为“非缓存”由默认;这确保了每个请求都能得到一致的结果。例如,如果您有一个购物车系统并且您的浏览器缓存/add?product=xyz,它可能不会再次添加该产品;如果您有一个购物车系统并且您的浏览器缓存/add?product=xyz,这可能不是你想要的。

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