在RHEL 7部署旧版Angular/PHP应用遇资源解析错误及PHP无法正常处理的排查求助
在RHEL 7部署旧版Angular/PHP应用遇资源解析错误及PHP无法正常处理的排查求助
看起来你遇到的两个核心问题——Angular JS资源返回HTML导致解析报错、phpinfo.php返回首页——本质上是同一个根源:Apache没有正确处理PHP文件,同时路由规则把静态资源请求错误转发到了未被执行的PHP首页文件。下面一步步帮你排查:
一、先解决PHP无法被Apache处理的核心问题
你提到找不到mod_php7.c,这确实是关键。RHEL 7默认自带的是PHP 5.4,如果你需要PHP 7,大概率是通过Red Hat Software Collections(SCL)安装的rh-php7x系列包(比如rh-php72、rh-php74),这类包的模块路径和名称都不是默认的,所以你配置里的<IfModule mod_php7.c>根本不会生效(而且.c是源码文件,Apache实际加载的是编译后的.so模块)。
具体排查步骤:
- 先确认服务器上的PHP安装情况:
# 检查已安装的PHP相关包 yum list installed | grep php # 检查是否是SCL的PHP包 yum list installed | grep rh-php - 如果是SCL的PHP包,修改Apache配置加载正确的模块:
以rh-php72为例,模块路径通常是/opt/rh/rh-php72/root/usr/lib64/httpd/modules/libphp72.so,把你的配置改成:
如果是默认的PHP 5.4,模块路径是# 先加载PHP模块 LoadModule php7_module /opt/rh/rh-php72/root/usr/lib64/httpd/modules/libphp72.so # 替换原有的IfModule块 <IfModule php7_module> AddType text/html .php DirectoryIndex index.php <FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch> # 其他PHP相关配置(比如php_value) </IfModule>/usr/lib64/httpd/modules/libphp5.so,对应修改LoadModule和<IfModule php5_module>即可。 - 测试PHP是否生效:
创建一个简单的test.php,内容如下:
访问这个文件,如果返回<?php echo "PHP 运行正常!"; ?>PHP 运行正常!,说明PHP处理已经正常;如果还是返回首页,那就要看路由重写的问题了。
二、解决Angular资源返回HTML的问题
之前请求angular.min.js这类文件返回HTML,大概率是因为你的Apache配置里有SPA应用常见的路由重写规则,但当时PHP没生效,导致index.php被当成静态文件返回。
排查步骤:
- 检查Apache配置(包括应用目录下的
.htaccess,如果启用了AllowOverride)里是否有类似规则:
这个规则的作用是:如果请求的文件/目录不存在,就转发到RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [L]index.php处理。当PHP生效后,这个规则会正常工作——存在的静态资源(JS/CSS)会直接返回,不存在的请求才会交给PHP处理。 - 同时确认Angular静态资源的路径正确,比如是否是相对路径,且文件确实存在于Apache的
DocumentRoot目录下。
三、其他容易忽略的排查点
- 查看Apache错误日志:
/var/log/httpd/error_log或/var/log/httpd/*error.log里会有模块加载失败、PHP执行错误、路由重写的详细日志,这是排查问题最有效的工具。 - 对比参考服务器的完整Apache配置:不仅要看你的自定义配置,还要检查
/etc/httpd/conf/httpd.conf、/etc/httpd/conf.d/下的其他文件,比如是否启用了mod_rewrite模块(LoadModule rewrite_module modules/mod_rewrite.so)。 - 检查SELinux状态:RHEL 7默认SELinux是Enforcing状态,可能会阻止Apache访问PHP文件或执行PHP。可以临时关闭测试(
setenforce 0),如果问题解决,再配置SELinux规则(比如chcon -R -t httpd_sys_rw_content_t /你的应用目录路径)。 - 确认目录权限:Apache运行用户(通常是
apache或httpd)对应用目录有读权限,对PHP文件有读权限。
备注:内容来源于stack exchange,提问作者DysonC
相关产品推荐
相关产品推荐

