Apache 2.4 中的 KeepAlive 干扰表单提交

Apache 2.4 中的 KeepAlive 干扰表单提交

我刚刚将服务器升级到 Debian Jessie,其中包括 Apache 2.4.10(原为 2.2)和 PHP 5.6。

现在,SSL 网站在某些情况下无法在 IE11 和 iPad Safari 上提交表单(不确定桌面 Safari 是否如此)。Firefox 和 Chrome 都可以。当它失败时,它会在 IE 中生成一个 IE 错误页面“无法显示此页面”。只是要强调:我可以访问该网站并查看表单,但表单提交失败了。

这在某种程度上与 KeepAlive 和 SSL 有关。如果我在 SSL VirtualHost 中关闭 KeepAlive,问题就会消失。(它使用 SNI,尽管显示错误的站点之一是第一个 SSL 站点)。我正在使用 mpm-itk(升级之前)。

在 IE11(在 Windows 7 上)中,它发生在 * SSL(HTTPS) * Apache KeepAlive On,KeepAliveTimeout 5(默认值) * 带有文件上传的表单(因此 enctype=multipart/form-data),* 仅当实际提供文件时(没有文件或带有其他字段也没关系;即使是 1 字节文件也会导致失败,与文件大小无关)。 * 仅当在显示表单后 60 秒内开始上传时(即,如果您在按提交前将其保留 60 秒也没关系)

没有任何线索表明失败的原因。服务器日志中没有任何内容表明它再次联系了服务器。错误是立即发生的。IE 调试器中除了在网络页面的结果列中显示“(已中止)”和“导航发生:文件:dnserror.htm”之外没有任何内容,我猜想这只是它正在显示的页面,但尽管名称如此,但据我所知并没有 DNS 错误。当我按下提交按钮时,Fiddler 没有显示任何网络流量。Windows 事件查看器中没有任何相关内容。这是最奇怪的事情 - 它似乎甚至没有尝试。

对于 Apache 2.4,我按照此处的建议设置了 SSL:https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=apache-2.4.10&openssl=1.0.1k&hsts=no&profile=intermediate。CiperSuite 与我的 2.2 设置相比没有变化,但现在已启用 OCSP 标记。2.4 的主要变化是 TLS1.2(但我认为 Fidler 会降级它,所以不太可能是那样)。HSTS 已启用,但之前是启用的。SSLLabs 给该网站的评级为 A+,并且没有指出任何错误。

我尝试将 KeepAliveTimeout 更改为 60;并且还放回旧的 BrowserMatch”。MSIE。“nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0 和 BrowserMatch ”。MSIE。“ssl-unclean-shutdown 作为一个实验,我认为这确实有一些效果,即它在第一次尝试后就可以正常工作。但是从新启动的浏览器第一次访问仍然会失败。这可能是因为它在 SSL 协商之后才能确定浏览器,那时已经太晚了,但之后浏览器会有更多的信息?也有可能我无法在 60 秒内完成这个过程,所以第二次是可以的。

我制作了一个小测试站点来演示这个问题:https://iet.davidearl.uk。它有一个仅用于测试用例的自签名证书,因此第一次访问时会出现证书警告,但实际存在问题的网站并非如此。服务器端在测试用例中所做的只是回显提交文件的文件名,否则 HTML 源代码就是全部。

在 iPad 上,问题似乎更严重。似乎根本无法提交表单(尽管可以正常显示它们;无论它们是否有文件上传)。有时它只是挂起,有时它会产生内部生成的错误页面(“Safari 无法打开页面,因为网络连接丢失”),具体取决于表单的构造方式。不过,同样,常见的情况是,如果您等待 60 秒,然后按下提交按钮,它就可以正常工作。不过,旧版本的 PC 版 Safari(5.1.7)可以正常工作。

Windows 7(不同版本)上的 IE9 的行为与 iPad Safari 类似 - 除非您在显示表单后等待 60 秒,否则它会挂起。Windows 10 上的 Microsoft Edge 和 Surface RT 平板电脑上的 IE 似乎也以与 IE11 相同的方式失败。我还观察到一个案例,其中访问服务器的 PHP“file_get_contents("https..."”始终挂起整整 60 秒才成功,而之前可以立即运行。

我已经尝试过 http://superuser.com/questions/516030/apache-2-4-on-windows-responds-slowly-hangs-when-serving-some-dynamic-pages - 没有变化这也许是相关的,但在他们的情况下 KeepAlive Off 没有效果;暂时关闭服务器防火墙也没有什么区别:http://serverfault.com/questions/678009/windows-8-ie-10-tls-handshake-errors-to-apache-2-2-on-centos-6-6 我曾尝试重新排序 SSLCipherSuite,将 ECDHE-RSA-AES128-SHA256 置于列表的更高位置(例如如此处建议:http://serverfault.com/questions/677338/why-is-internet-explorer-11-unable-to-connect-to-https-sites-when-tls-1-2-is-ena)在 Internet 属性 > 内容上清除 SSL 状态也没有什么区别。

显然存在与 KeepAlive 和 SSL 相关的问题,这种情况并不常见,但我不知道它是什么,也没有任何线索可以帮助我找出原因。广泛的搜索没有找到任何有用的信息。

答案1

我遇到了完全相同的问题(花了好几天的时间才解决这个问题!)。

事实证明这是 mpm-itk 中的一个错误(参见http://lists.err.no/pipermail/mpm-itk/2015-September/thread.html)。这个错误现在已在昨天发布的最新版本中得到纠正。

您可以在以下位置下载此新版本http://mpm-itk.sesse.net/,但您必须自己从源代码编译它。如果您按照 README 文件中的说明操作,则非常简单。

答案2

谢谢你的提问!公民答案。我也使用 ITK(不确定为什么更多人不使用它 - 它提供了非常有用的虚拟主机之间的权限分离)。

我不想重新编译一些东西来消除这个错误,而是宁愿相信有一天它会进入 Jessie 并apt-get奇迹般地修复它。但我的客户等不及了!

我注意到,在 IE 下,某些版本的 jQuery 比其他版本更容易导致这种情况发生。因此,我通过重新使用所用的 jQuery 版本解决了一半的问题。但 Safari 仍然存在问题 - 有时会运行,有时会默默失败。

我使其工作的方法是使用 Apache 配置setenvif.conf文件,我对其进行了编辑以包括:

BrowserMatch "Mac OS X" nokeepalive

这个想法应归功于其他人

这样,Mac 用户的 keepalive 就关闭了。虽然我并不怀疑这会让他们的速度变慢一点,但在我看来,这比破坏用户体验/无法正常工作要好。

相关内容