如何防止apache在304个答案</s>上发送连接关闭标题<s>

时间:2016-09-13 14:26:22

标签: php apache http response keep-alive

我有以下设置:

某些文件是根据某些(仅少数)会话参数动态生成的。由于它们没有很大的多样性,我允许在代理/浏览器中进行缓存。这些文件在他们的路上得到了一个etag,乍一看整个Web应用程序的反应似乎是正确的:文件服务正确地依赖于会话情况,节省了流量。

然后是这种错误的行为:

但仔细观察后,我发现在他的回答中,如果这些动态生成的文件为304,则apache错误地发送“Connection:close”标题而不是正常发送的“Connection:KeepAlive”。他应该做的是:不要操纵任何有关“连接”的事情。

我找不到任何指出这种行为原因的地方:apache配置文件中没有任何地方写入除了一个文件中的一行外,它被指示发送一个keepalive - 它做的 - 只要它不会为动态生成的文件发送304响应。在PHP中没有任何地方我指示那个人发送除了Keepalive以外的任何东西(而后者只是试图反击连接:关闭)。

当apache提供“普通”(非动态)文件(304个答案)时,它不会这样做。因此,在某种程度上,我假设PHP内核可能会在未经许可或被要求的情况下干扰此处。但是,在apache配置中添加了一个“Header set Connection'Kave-Alive'”,我也加入了它来阻止连接的关闭,它也不起作用。通常,当您在apache配置中放置这样的标头集规则(不是“早期”类型)时,此规则在完成所请求文档上的任何子排序工作之后执行操作(因此在完成PHP输出之后)。但就我而言,没有任何事情发生 - 好吧:如果是304响应。在所有其他情况下,一切正常和正确。

由于在页面请求时有一些其他文件在线上,我希望得到apache摆脱那些连接闭包。

有没有人知道如何处理这种行为?

1 个答案:

答案 0 :(得分:1)

P.S。:有一天(和良好的睡眠)之后,事情正在消失:

在这种情况下,罪魁祸首(代表我)是一个短视的复制示例片段,其中包含“HTTP / 1.&gt;&gt;&gt; 0&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 304&gt;” / p>

此协议版本号由apache(正确)后处理(在所有其他方面 - 包括任何apache模块工作 - 完成后),因为它决定不通过线路发送“Connection:Keep-Alive”,因为版本HTTP / 1.0中不存在该功能。

在这种情况下的问题是要关注这样一个事实,即php和apache模块中的所有内容都能正常工作,并且外部环境中的某些东西一定是错误的,然后将视图转移到代码中的任何内容可能会影响外部环境(例如协议版本)。