Apache从2.4.59升级到2.4.60后,通过重定向/默认索引访问时PHP文件被返回原始文本的异常问题
看到你这个问题真的挺闹心的——毕竟自己编译Apache几十年,居然在2.4.59升2.4.60时踩了这个坑,确实够奇怪的。结合你描述的现象:访问根目录默认加载index.php时浏览器直接下载原始文件,但直接访问https://servername/index.php却完全正常,十有八九是Apache 2.4.60在默认索引文件处理逻辑或者重写规则触发PHP解析的时机上做了调整,导致跳转后的请求没命中PHP解析的配置。
给你几个具体的排查和解决方向:
确认
DirectoryIndex的配置优先级
先检查你的Apache配置里DirectoryIndex是不是把index.php放在最前面,比如:DirectoryIndex index.php index.html index.htm虽然你之前的配置没问题,但2.4.60可能对默认索引的匹配触发逻辑做了微调,比如如果目录里有其他静态索引文件(哪怕你觉得没有),可能会优先匹配并跳过PHP handler,所以先确保
index.php的优先级最高。排查PHP解析handler的覆盖范围
如果你用的是mod_php,检查你的SetHandler/AddHandler配置是不是只针对明确的.php请求,而没有覆盖到默认索引跳转后的内部请求。比如之前的配置可能是:<FilesMatch "\.php$"> SetHandler application/x-httpd-php </FilesMatch>可以试试把配置改成针对站点根目录的
<Directory>块里,确保所有PHP文件都能触发解析:<Directory "/path/to/your/site"> Options +ExecCGI AddHandler php-script .php SetHandler application/x-httpd-php </Directory>要是用的是
php-fpm,检查ProxyPassMatch规则是不是覆盖了内部跳转的情况,比如:ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/$1如果这条规则没匹配到内部跳转的
/index.php,可以试试用RewriteRule强制把根目录请求转成明确的index.php:RewriteEngine On RewriteRule ^/$ /index.php [L]查看Apache 2.4.60的更新日志
去Apache官方看看2.4.60的更新条目,重点找和mod_dir(处理默认索引)、mod_rewrite相关的内容,说不定是新版本修复了某个bug,但引入了新的逻辑问题,这能帮你快速定位根源。开启调试日志追踪请求流程
临时把Apache的日志级别调到debug:LogLevel debug然后访问根目录,查看日志里记录的内部请求路径和handler触发情况。如果日志显示
/被内部重定向到/index.php但没触发PHP解析,那就是handler配置的问题;如果连内部重定向都没执行,那就是mod_dir的模块逻辑问题。
另外你提到的CentOS 8,虽然你觉得无关,但CentOS 8默认的Apache模块加载顺序可能有特殊设置,升级后模块优先级变化也可能导致这个问题,比如试试调整mod_dir在mod_rewrite之前加载?
总结下来,核心就是默认索引跳转后的请求没触发PHP解析handler,从上面几个方向排查应该能解决问题。
备注:内容来源于stack exchange,提问作者Bleve

