ホームページ  >  記事  >  バックエンド開発  >  nginx が php ファイルを見つけられない場合はどうすればよいですか?

nginx が php ファイルを見つけられない場合はどうすればよいですか?

coldplay.xixi
coldplay.xixiオリジナル
2020-07-22 10:08:474178ブラウズ

nginx が php ファイルを見つけられない問題の解決策: 1. root 命令をサーバー ブロックに配置し、各場所が親サーバー ブロックで定義された documentroot を継承するようにします; 2. nginx が存在しないファイルをインターセプトします[try_files] を使用します。存在しない URL をキャッチし、エラーを返します。

nginx が php ファイルを見つけられない場合はどうすればよいですか?

nginx は php ファイルの解決策を見つけることができません:

1. 間違ったパスが送信されますphp-fpm プロセス

# に移動します。このようなエラーが発生する場合、10 のうち 9 は、バックエンドの fastcgi プロセスが間違ったパス (SCRIPT_FILENAME) を受信することが原因です。 fastcgi プロセスが間違ったパスを受け取るのは、主に構成エラーが原因です。

一般的な nginx.conf の設定は次のとおりです:

server {
    listen   [::]:80;
    server_name  example.com www.example.com;
    access_log  /var/www/logs/example.com.access.log;  
    location / {
        root   /var/www/example.com;
        index  index.html index.htm index.pl;
    }
    location /images {
        autoindex on;
    }
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/example.com$fastcgi_script_name;
        include fastcgi_params;
    }
}

この設定には多くの不合理な点があります。明らかな問題の 1 つは、root ディレクティブが location / に配置されていることです。 ## #ピース。ルート ディレクティブが location ブロックで定義されている場合、ルート ディレクティブは、それが配置されている場所でのみ有効になります。他の場所にはルート ディレクティブがありません。たとえば、location /images ブロックはどのリクエストにも一致しません。この問題を解決するには、リクエストごとにルート ディレクティブを繰り返し構成する必要があります。

したがって、各場所が親サーバー ブロックによって定義されたドキュメントルートを継承するように、ルート ディレクティブを

server ブロックに配置する必要があります。ある場所で別のドキュメントルートを定義する必要がある場合は、場所の場合 場所で別の document_root を定義する必要がある場合は、その場所で別のルート ディレクティブを定義できます。

もう 1 つの問題は、fastCGI パラメータ

SCRIPT_FILENAME がハードコーディングされていることです。ルート ディレクティブの値を変更するか、ファイルを別のディレクトリに移動すると、php-fpm は「入力ファイルが指定されていません」エラーを返します。これは、SCRIPT_FILENAME が構成内でハードコーディングされており、# に従わないためです。 ## $document_root は変更に応じて変更されます。SCRIPT_FILENAME 構成を次のように変更できます: <pre class="brush:php;toolbar:false">fastcgi_param SCRIPT_FILENAME documentrootdocumentrootfastcgi_script_name;</pre>

したがって、サーバー ブロック内のルート ディレクティブを構成することを忘れてはなりません。それ以外の場合は、値がdocumentroot に渡される値が空の場合、

fastcgi_script_name

のみが php-fpm に渡され、「入力ファイルが指定されていません」エラーが発生します。

2. 要求されたファイルは実際には存在しません

nginx が存在しない .php ファイルに対する要求を受信した場合、nginx は$uri が .php で終わるかどうかだけをチェックし、ファイルが存在するかどうかは判断しません .php で終わる nginx リクエストは、直接 php-fpm に送信されて処理されます。 php-fpm の処理中にファイルが見つからない場合は、「404 Not Found」ヘッダーとともに「入力ファイルが指定されていません」が返されます。

解決策

nginx に存在しないファイルをインターセプトし、カスタム 404 エラーをリクエストして返します

try_files

を使用して存在しない URL をキャプチャし、エラーを返します。 <pre class="brush:php;toolbar:false">location ~ .php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME .... ................................... ................................... }</pre>上記の設定では .php ファイルが存在するかどうかがチェックされ、存在しない場合は 404 ページが返されます。

関連する学習の推奨事項:
PHP プログラミングの入門から熟練度まで

以上がnginx が php ファイルを見つけられない場合はどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。