问题原因
通常由于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字段所在行前添加半角分号;注释代码。; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root ; if you are running php as a CGI under any web server (other than IIS) ; see documentation for security issues. The alternate is to use the ; cgi.force_redirect configuration below ; http://php.net/doc-root ; doc_root = ; The directory under which PHP opens the script using /~username used only ; if nonempty. ; http://php.net/user-dir user_dir = -
修改
cgi.force_redirect。删除
cgi.force_redirect = 1字段所在行前的;,并将参数值从1修改为0。不强制要求PHP脚本必须通过网页访问。; cgi.force_redirect is necessary to provide security running PHP as a CGI ; most web servers. Left undefined, PHP turns this on by default. You can ; turn it off here AT YOUR OWN RISK ; **You CAN safely turn this off for IIS, in fact, you MUST.** ; http://php.net/cgi.force-redirect cgi.force_redirect = 0 ; if cgi.nph is enabled it will force cgi to always sent Status: 200 with ; every request. PHP's default behavior is to disable this feature. ;cgi.nph = 1
-
-
重启IIS服务。
按
Win+R输入PowerShell并按Enter键,进入PowerShell界面后,重启IIS服务。iisreset /noforce
-
-
验证网站是否恢复访问。
完成上述修复后,重新访问网站。