原因
このエラーは通常、Web サーバーが指定された PHP ファイルまたはスクリプトを見つけられない場合に発生します。考えられる原因は次のとおりです。
open_basedirの制限: Web サイトのルートディレクトリにある.user.iniファイルをチェックして、open_basedirの構成に必要なすべてのディレクトリへのパスが含まれていることを確認します。不正な書き換えルールの構成: Web サイトの構成ファイル内の書き換え (疑似静的) ルールをチェックして、リクエストが存在しない PHP ファイルに誤ってリダイレクトされていないことを確認します。
不正な PHP ハンドラー構成: Web サイトの構成ファイル内の PHP ランタイムモード設定をチェックして、Web サーバーがリクエストを PHP インタープリターに渡すことを確認します。
解決策
Linux
以下のステップでは、Alibaba Cloud Linux 3 を例として使用します。
ECS インスタンスにログインします。
ECS コンソール - インスタンス に移動します。上部のナビゲーションバーで、ターゲットリージョンとリソースグループを選択します。
ターゲットインスタンスの詳細ページに移動します。[接続] をクリックし、[Workbench] を選択します。ページ上のプロンプトに従ってターミナルにログインします。
open_basedirの制限を確認します。Web サイトのディレクトリで、隠し構成ファイル
.user.iniがあるか確認します。sudo ls -la <website_directory>たとえば、Web サイトのディレクトリが
/www/wwwroot/www.abc.com/の場合、sudo ls -la /www/wwwroot/www.abc.com/を実行します。ファイルが存在する場合は、次のステップに進みます。
ファイルが存在しない場合、この制限は適用されません。構成ファイルの変更 に進みます。
open_basedirの設定を確認します。.user.iniファイルで、open_basedirで始まる行を見つけます。ディレクトリリストにターゲット Web サイトの完全なルートパスが含まれているか確認します。たとえば、Web サイトのディレクトリが
/www/wwwroot/www.abc.comであるにもかかわらず、.user.iniファイルにopen_basedir=/www/wwwroot/www.test.com/:/tmp/が含まれている場合は、不足しているパスを追加します。
構成ファイルを変更します。
Apache
.htaccessファイルを確認して修正します。Web サイトのルートディレクトリに移動し、
.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 インタープリターが正しいファイルパスを見つけられるようになり、互換性が向上します。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
Web サイトへのアクセスを確認します。
これらのステップを完了したら、Web サイトをリフレッシュして問題が解決されたことを確認します。
Windows
以下のステップでは、インターネットインフォメーションサービス (IIS) を搭載した Windows Server 2022 を例として使用します。
ECS インスタンスにログインします。
ECS コンソール - インスタンス に移動します。上部のナビゲーションバーで、ターゲットリージョンとリソースグループを選択します。
ターゲットインスタンスの詳細ページに移動し、[接続] をクリックして [Workbench] を選択します。接続方法を [ターミナル] に設定し、ユーザー名とパスワードを入力して、グラフィカルターミナルページにログインします。
open_basedirの制限を確認します。Web サイトのディレクトリに隠し構成ファイル
.user.iniが存在するかどうかを確認します。ファイルエクスプローラーのメニューで、[表示] をクリックし、[隠しファイル] チェックボックスを選択します。
ファイルが存在する場合は、次のステップに進みます。
ファイルが存在しない場合、この制限は適用されません。IIS PHP ハンドラー構成のトラブルシューティング に進みます。
open_basedirの設定を確認します。.user.iniファイルで、open_basedirで始まる行を見つけます。ディレクトリリストにターゲット Web サイトの完全なルートパスが含まれているか確認します。たとえば、Web サイトのディレクトリが
C:\inetpub\wwwroot\mywebsiteであるにもかかわらず、.user.iniファイルにopen_basedir = "C:\inetpub\wwwroot\abc"が含まれている場合、パスが正しくないため修正する必要があります。
IIS の PHP ハンドラー構成を確認します。
php.iniファイルを編集します。doc_rootをコメントアウトします。doc_rootフィールドを含む行の先頭にセミコロン (;) を追加してコメントアウトします。
cgi.force_redirectを変更します。cgi.force_redirect = 1を含む行の先頭からセミコロン (;) を削除し、その値を `0` に変更します。この変更によりセキュリティチェックが無効になり、PHP が IIS で実行できるようになります。
IIS サービスを再起動します。
Win+Rを押し、PowerShellと入力してEnterを押します。PowerShell ウィンドウで、次のコマンドを実行して IIS サービスを再起動します。iisreset /noforce
Web サイトへのアクセスを確認します。
これらのステップを完了したら、Web サイトに再度アクセスして問題が解決されたことを確認します。