当我在Apache + mod_php5中设置自定义头时,这个功能非常好用:
header('Foo: Bar');
但是,当我尝试在发送304未修改响应的同时执行此操作时,Apache似乎已经删除了头信息(包括X-Powered-By和其他标准头信息)。
header('HTTP/1.1 304 No Content');
header('Foo: Bar');
有人知道如何解决这个问题吗?
当我在Apache + mod_php5中设置自定义头时,这个功能非常好用:
header('Foo: Bar');
header('HTTP/1.1 304 No Content');
header('Foo: Bar');
有人知道如何解决这个问题吗?
Foo: Bar
,还是该值会动态更改?如果不是,我已经成功实现了它。由于某种原因,即使发送 304,我也有 X-Powered-By。 - Benhttp://svn.apache.org/viewvc/httpd/httpd/tags/2.4.23/modules/http/http_filters.c?view=markup#l1331
所以,无论我们是否喜欢它(因为我也遇到了Apache从响应中删除我的CORS头部当我发送304的情况),看起来Apache确实遵循RFC建议,并将所有不在该列表之内的内容视为实体头部。
一种解决方案是修补Apache源代码以扩展该列表并转向部署您自己的软件包到服务器,但这肯定不是没有自己的长列表的影响。另一方面,我听说nginx没有这个问题。
我提供的内容将被标准浏览器中的WebGL运行时等消费,因此如果它们对我的304响应中缺乏CORS表示抱怨,我将不得不将所有内容转换为200 OK并放弃带宽节省。
header('Foo: Bar');
flush();
header('HTTP/1.1 304 No Content');
只有在找到304之前,Apache才不会删除任何标题。 在发送304之前,我们通过flush()强制发送其他标题。 那个Apache不能伤害我。
尝试:
header('Foo: bar', true, 304);
header('Foo: Bar', true, 304);
。至于“头似乎被Apache删除了” - 您需要显示您的Apache配置(httpd.conf
,您的<VirtualHost>
以及.htaccess
- 这些指令可以放在任何地方)。 - LazyOneexpose_php = Off
,PHP本身可能根本不会发送X-Powered-By
。至于304 - 在我的初始评论之后,我重新运行了几个测试,并且是的 - 自定义标头已被删除,但对于404和其他非3xx代码(使用302、303、305、306进行检查)则存在。必须是针对304特定优化(304 =未修改),其中响应正文必须尽可能小。 - LazyOne