我正在使用以下configuration为我的虚拟主机运行带有PHP 5.4.21的Apache 2.4.6(Amazon)的标准安装:
DirectoryIndex index.php # ... FallbackResource /index.php
我的index.php是简单的缩影:
<?php echo "Hello world";
访问http://<server-name>/神秘地显示整个页面五秒钟后! 任何其他页面都有预期的响应时间(这是很快的)。
正如我所知道的,这五秒钟与Keep-Alivefunction的默认等待时间有关。 在这种情况下,分段响应的最后几个字节不会被发送,直到Apache在等待时间之后断开连接。 顺便说一句,这也完全破坏了一个持久的联系,否则会给你的任何收益。
这是Apache的一个已知的错误,或者我错过了一些非常明显的东西吗?
2017/04/18 :已经在Apache 2.4.25中修复: https ://bz.apache.org/bugzilla/show_bug.cgi ? id = 58292
从这个错误报告中,我意识到这个问题可能与DirectoryIndex指令有关。
标准的Apache安装随configuration中的以下部分提供:
<IfModule dir_module> DirectoryIndex index.html </IfModule>
此语句后面的任何指令(例如虚拟主机中的指令)都不会覆盖此设置; 相反,它会被添加到请求索引时将要尝试的一堆页面中。 当你执行strace httpd -X并且在请求被读取后检查stat()调用时,可以确认这种行为,例如:
stat("/path/to/vhost/index.html", 0x7fff9dc41b90) = -1 ENOENT stat("/path/to/vhost/index.php", {st_mode=S_IFREG|0664, st_size=130, ...}) = 0
虽然我不能确切地说明原因,但在指定DirectoryIndex index.php之前,必须先清除之前的任何DirectoryIndex指令,即index.php必须是试图处理请求的第一个页面。
这可以使用以下configuration完成:
DirectoryIndex disabled DirectoryIndex index.php