问题原因
通常由于Web服务器无法找到指定的PHP文件或脚本导致。可能原因如下:
open_basedir限制: 检查网站根目录下的.user.ini文件,确认open_basedir配置项的值包含了网站所需的所有目录访问权限。伪静态规则配置错误:检查网站配置文件中的伪静态(rewrite)规则,确保规则没有将请求错误地重定向到不存在的 PHP 文件。
PHP处理器配置错误:检查网站配置文件中与PHP运行模式相关的设置,确保Web服务器能够正确地将请求传递给 PHP 解释器。
解决方案
Linux
以Alibaba Cloud Linux 3为例。
登录ECS实例。
访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。
进入目标实例详情页,单击远程连接,选择通过Workbench远程连接。根据页面提示登录,进入终端页面。
检查是否存在
open_basedir限制。检查Web站点目录下是否存在
.user.ini隐藏配置文件。sudo ls -la <网络站点目录>以Web站点目录
/www/wwwroot/www.abc.com/为例,需执行sudo ls -la /www/wwwroot/www.abc.com/。若存在,需继续排查是否受到
open_basedir限制;若不存在,表明未受
open_basedir限制,需修改配置文件。
检查是否受到
open_basedir限制。在
.user.ini中找到open_basedir开头的行,检查等号右侧目录列表是否包含了目标Web站点的完整根目录路径。以Web站点目录
/www/wwwroot/www.abc.com为例,若隐藏文件.user.ini中的open_basedir=/www/wwwroot/www.test.com/:/tmp/,表示未包含Web站点目录,需修改。
修改配置文件。
Apache
检查并修正
.htaccess文件。进入网站根目录下,查看是否存在
.htaccess文件,若存在,需确保RewriteRule所在行配置如下。确保请求正确重定向到
index.php中。RewriteRule ^(.*)$ /index.php?/$1 [L]重启Apache服务。
sudo systemctl restart httpd
Nginx
检查并修正php.ini配置。
编辑
/etc/php.ini文件,确保cgi.fix_pathinfo参数值为1。默认值为1,PHP会尝试加载与URL匹配的实际存在的文件,兼容性更好。
检查并修正
fastcgi.conf配置。编辑
/etc/nginx/fastcgi.conf文件,确保文件已保存如下配置。确保Web服务器能够正确地将请求传递给 PHP 解释器。fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $document_root;重启Nginx服务。
sudo systemctl restart nginx
验证网站是否恢复访问
完成上述修复后,重新访问网站。
Windows
以Windows Server 2022,IIS Web服务为例。
登录ECS实例。
访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。
进入目标实例详情页,单击远程连接,选择通过Workbench远程连接。选择连接方式为终端连接,输入账号和密码,登录图形化终端页面。
检查是否存在
open_basedir限制。检查Web站点目录下是否存在
.user.ini隐藏配置文件。单击文件栏上方的查看,勾选隐藏的文件。
若存在,需继续排查是否受到
open_basedir限制。若不存在,表明未受
open_basedir限制,排查IIS的PHP处理器配置。
检查是否受到
open_basedir限制。在
.user.ini中找到open_basedir开头的行,检查等号右侧目录列表是否包含了目标Web站点的完整根目录路径。以Web站点目录
C:/inetpub/wwwroot/mywebsite为例,若隐藏文件.user.ini中的open_basedir = "C:/inetpub/wwwroot/abc,表示未包含Web站点目录,需修改。
排查IIS的PHP处理器配置。
编辑
php.ini文件。注释
doc_root。在
doc_root字段所在行前添加半角分号;注释代码。
修改
cgi.force_redirect。删除
cgi.force_redirect = 1字段所在行前的;,并将参数值从1修改为0。不强制要求PHP脚本必须通过网页访问。
重启IIS服务。
按
Win+R输入PowerShell并按Enter键,进入PowerShell界面后,重启IIS服务。iisreset /noforce
验证网站是否恢复访问。
完成上述修复后,重新访问网站。