nginx で php を設定する方法: まず、Nginx で fastcgi_params および fastcgi.conf 構成ファイルを変更し、次に、PHP で cgi.fix_pathinfo がオンになっているときに try_files コマンドを使用して 1 回フィルタリングします。
推奨: 「PHP ビデオチュートリアル 」
このチュートリアルの動作環境: linux5.9.8 システム、PHP7 .1 バージョンでは、この方法はすべてのブランドのコンピューターに適用できます。
Nginx PHP の構成
多くの人にとって、Nginx PHP の構成は、チュートリアルを検索してコピーして貼り付けることに他なりません。何の問題もないように思えますが、実はインターネット上の多くの情報は荒廃しており、抜け穴が多く、深い理解を求めずにただコピペしてしまうと、遅かれ早かれその代償を払うことになります。 。
PHP を使用してフロントエンド コントローラーを実装するとします。率直に言えば、これは統合された入り口です。すべての PHP リクエストを同じファイルに送信し、このファイル内の "REQUEST_URI" を解析してルーティングを実装します。ファイル。
現時点では、多くのチュートリアルで次のように Nginx PHP を構成する方法が説明されています:
server { listen 80; server_name foo.com; root /path; location / { index index.html index.htm index.php; if (!-e $request_filename) { rewrite . /index.php last; } } location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME /path$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; } }
多くのエラー、または少なくとも悪臭があります。調べてみるといくつか見つかります。 。
#…
「index」ディレクティブから始めましょう。問題の設定では、それは「location」で定義されています:
location / { index index.html index.htm index.php; }
新しいデータを将来の「場所」を定義する場合、必然的に「インデックス」命令が繰り返し定義されることになります。これは、複数の「場所」が水平関係にあり、継承がないためです。このとき、「インデックス」は「サーバー」で定義する必要があります。継承関係のヘルプ。「index」コマンドはすべての「場所」で有効になります。
…
「if」コマンドを見てみましょう。これは最も誤解されている Nginx コマンドであると言っても過言ではありません:
if (!-e $request_filename) { rewrite . /index.php last; }
Many 「if」命令は一連のチェックを行いますが、これは実際には「try_files」命令の役割です。
try_files $uri $uri/ /index.php;
さらに、初心者は、「if」命令がカーネルレベルの命令ですが、実際には書き換えモジュールの一部であり、Nginx 構成は実際には手続き型ではなく宣言型であるため、非書き換えモジュールからの命令と混合すると、期待どおりの結果が得られない可能性があります。
#…「fastcgi_params」設定ファイルを見てみましょう:include fastcgi_params;Nginx には、「fastcgi_params」と「fastcgi.conf」という 2 つの fastcgi 設定ファイルがあります。大きな違いはありません。唯一の違いは、後者には前者よりも「SCRIPT_FILENAME」定義が 1 行多いことです:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;注: $document_root と $fastcgi_script_name の間に / はありません。 当初、Nginx には「fastcgi_params」しかありませんでしたが、後に「SCRIPT_FILENAME」を定義するときにハードコーディングを使用する人が多いことがわかり、使用方法を標準化するために「fastcgi.conf」が導入されました。 しかし、ここで疑問が生じます。なぜ古い構成ファイルを変更するのではなく、新しい構成ファイルを導入する必要があるのでしょうか?これは、「fastcgi_param」命令が配列型であるためです。通常の命令と同じで、内側の層が外側の層を置き換えます。通常の命令と異なるのは、同じレベルで複数回使用される場合、代わりに追加されることです。交換されました。つまり、同じレベルで「SCRIPT_FILENAME」を 2 回定義すると、両方ともバックエンドに送信されてしまい、潜在的な問題が発生する可能性があるため、このような状況を回避するために、新しい設定ファイルが導入されました。
#…
さらに、セキュリティの問題も考慮する必要があります。PHP が「cgi.fix_pathinfo」をオンにすると、PHP は間違ったファイル タイプを PHP ファイルとして解析する可能性があります。 Nginx と PHP が同じサーバーにインストールされている場合、最も簡単な解決策は、「try_files」コマンドを使用してフィルタリングすることです。
try_files $uri =404;
…
前の分析によれば、これは改善されました元のバージョンよりもはるかにきれいなバージョン:
server { listen 80; server_name foo.com; root /path; index index.html index.htm index.php; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { try_files $uri =404; include fastcgi.conf; fastcgi_pass 127.0.0.1:9000; } }
実際には、主に「try_files」と「fastcgi_split_path_info」の互換性が十分ではないため、まだいくつかの欠陥があります。それは解決できますが、解決策はかなり醜いです。詳細は割愛します。
補足: 「location」は限定されているため、実際には「fastcgi_index」は必要ありません。
以上がnginxでphpを設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。