Apache在发送304时忽略PHP头

时间:2011-06-27 10:18:56

标签: php apache http http-headers

当我在Apache + mod_php5中设置自定义标头时,这很好用:

header('Foo: Bar');

但是当我在同时发送304 Not Modified响应时尝试此时,标题似乎被apache删除(以及X-Powered-By和其他标准标题)。

header('HTTP/1.1 304 No Content');
header('Foo: Bar');

有谁知道如何解决这个问题?

4 个答案:

答案 0 :(得分:3)

这不回答这个问题吗?

  

如果条件GET使用了强缓存验证器(参见第13.3.3节),则响应不应该包含其他实体头。否则(即,条件GET使用弱验证器),响应绝不能包括其他实体头;这可以防止缓存的实体主体和更新的标头之间的不一致。

来自http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5

答案 1 :(得分:2)

从Apache 2.4.23(截至今天的最新版本,据我所知),当您发送304" Not Modified&时,您将无法解决该问题。 #34;确实,Apache确实删除了所有非白名单标题:

http://svn.apache.org/viewvc/httpd/httpd/tags/2.4.23/modules/http/http_filters.c?view=markup#l1331

因此,无论我们是否喜欢(因为我在发送304时,我在同一条船上将Apache的CORS标头从响应中删除),看起来Apache似乎遵循RFC建议并且它确实将那些不属于该列表的所有内容视为实体标题。

一个解决方案是修补Apache源代码以扩展该列表,并转而将自己开发的软件包部署到您的服务器上,但这绝对不是没有自己的一长串影响。另一方面,我听说nginx并没有遇到这个问题。

我提供的内容将被标准浏览器中的WebGL运行时消耗,所以如果他们在我的304响应中抱怨缺少CORS,我将不得不转向一切都达到200 OK,放弃了带宽节省。

答案 2 :(得分:0)

尝试:

header('Foo: bar', true, 304);

答案 3 :(得分:0)

我通过以下方法解决了这个问题: 1.将所有标头放在304标头之前 2.在发送304之前冲洗这些标头

header('Foo: Bar');
flush();
header('HTTP/1.1 304 No Content');

Apache在找到304之前不会删除任何标头。 我们在发送304之前通过flush()强制发送其他标头。 那个阿帕奇不会伤害我。