SLES 15 SP6升级后Apache默认索引index.php未触发PHP处理器导致文件被下载
这种SP升级后Apache和PHP的配置幺蛾子确实头疼,我帮你梳理几个最可能的排查方向,一步步来解决:
先确认PHP模块是否正常加载
升级过程很可能把模块加载的配置给冲了,先跑个命令检查:apachectl -M看输出里有没有
php8_module (shared)这一行——要是没有,说明PHP模块没加载。去Apache的conf.d目录(一般是/etc/apache2/conf.d/)找php8.conf,确保里面有类似下面的加载指令(路径可能随SLES的架构略有不同,比如32位是lib,64位是lib64):LoadModule php8_module /usr/lib64/apache2/libphp8.so要是文件本身都没了,可能得重新安装PHP的Apache模块包,比如
apache2-mod_php8(SLES的包名大概是这个)。检查PHP文件的处理器规则
就算模块加载了,要是没有告诉Apache怎么处理.php文件,它还是会把index.php当普通文件下载。打开PHP的Apache配置文件(比如/etc/apache2/conf.d/php8.conf),确认里面有针对PHP文件的处理规则,比如:<FilesMatch "\.php$"> SetHandler application/x-httpd-php </FilesMatch>或者SLES常用的
AddHandler php8-script .php也行。升级后这个配置可能被重置成默认的空或者注释掉了,把它恢复回来就行。确认DirectoryIndex在网站目录的上下文里生效
虽然你全局的httpd.conf里有DirectoryIndex index.php index.html index.html.var,但说不定某个<Directory>块(对应你的网站根目录的那个)里的配置覆盖了它。找到你网站根目录对应的<Directory>配置块,显式加上DirectoryIndex:<Directory "/var/www/html/sub.foo.com"> <!-- 换成你的实际网站根路径 --> DirectoryIndex index.php index.html AllowOverride None Require all granted # 其他你的权限配置 </Directory>这样能确保这个目录下的默认索引优先用index.php,而且和PHP处理器规则联动。
检查MIME类型配置
偶尔升级会搞乱MIME类型,导致Apache不知道.php是可执行脚本。检查/etc/apache2/mime.types或者Apache配置里有没有:AddType application/x-httpd-php .php没有的话加上这行,确保PHP文件被识别为需要处理的脚本类型。
验证配置并重启
每次改完配置,先跑apachectl configtest检查有没有语法错误,没问题的话重启Apache:systemctl restart apache2然后再测试访问
sub.foo.com/看看能不能正常执行index.php。对比升级前后的配置备份
SLES升级时会把旧配置备份成.rpmsave或者.orig后缀的文件,比如你可以对比/etc/apache2/httpd.conf和/etc/apache2/httpd.conf.rpmsave,还有PHP的配置文件,看看升级时哪些配置被修改了,把原来的正确配置挪回来(注意别覆盖版本相关的新路径,比如PHP8的模块路径和旧版本可能不一样)。
备注:内容来源于stack exchange,提问作者Peter VARGA

