nginx locationマッチング
2468 ワード
次に、典型的な簡単なPHPサイトでnginxがどのように要求に対してlocationを選択して処理するかを見てみましょう.
まず、nginxは接頭辞マッチングを使用して最も正確なlocationを見つけます.このステップでnginxは、locationがプロファイルに現れる順序を無視します.上記の構成では、一意の接頭辞マッチングlocationは「
すべてのlocationマッチングテストでは、パラメータセクションではなく要求されたURIセクションのみが使用されることに注意してください.これは、次のようなパラメータを書く方法が多いからです.
それ以外に、要求列に任意の文字列を追加できます.
次に、上記の構成を使用して、リクエストがどのように処理されているかを見てみましょう.は、「 要求「 は、「 が「
server {
listen 80;
server_name example.org www.example.org;
root /data/www;
location / {
index index.html index.php;
}
location ~* \.(gif|jpg|png)$ {
expires 30d;
}
location ~ \.php$ {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
include fastcgi_params;
}
}
まず、nginxは接頭辞マッチングを使用して最も正確なlocationを見つけます.このステップでnginxは、locationがプロファイルに現れる順序を無視します.上記の構成では、一意の接頭辞マッチングlocationは「
/
」であり、任意のリクエストにマッチングできるため、最後の選択として扱われる.次にnginxは、構成中の順序で正規表現のlocationを順次マッチングし続け、最初の正規表現にマッチングした後、検索を停止する.一致するlocationが使用されます.正規表現のlocationに一致しない場合は、見つかったばかりの最も正確な接頭辞で一致するlocationを使用します.すべてのlocationマッチングテストでは、パラメータセクションではなく要求されたURIセクションのみが使用されることに注意してください.これは、次のようなパラメータを書く方法が多いからです.
/index.php?user=john&page=1
/index.php?page=1&user=john
それ以外に、要求列に任意の文字列を追加できます.
/index.php?page=1&something+else&user=john
次に、上記の構成を使用して、リクエストがどのように処理されているかを見てみましょう.
/logo.gif
」が最初にlocation「/
」に一致し、次いで、上正規表現「\.(gif|jpg|png)$
」に一致することを要求する.したがって、後者によって処理されます.「root /data/www
」命令に従って、nginxは要求をファイル/data/www/logo.gif
」にマッピングし、このファイルをクライアントに送信する./index.php
」は、まずlocation「/
」にも一致し、次いで、上正規表現「\.(php)$
」にも一致する.したがって、後者によって処理され、localhost:9000で傍受されているFastCGIサーバに送信される.fastcgi_param命令は、FastCGIのパラメータSCRIPT_FILENAME
の値を「/data/www/index.php
」に設定し、FastCGIサーバがこのファイルを実行する.変数$document_root
はroot命令設定の値に等しく、変数$fastcgi_script_name
の値は要求されたuri、「/index.php
」である./about.html
」がlocation「/
」にのみ一致することを要求するため、このlocationを使用して処理される.「root /data/www
」命令に従って、nginxは、要求をファイル「/data/www/about.html
」にマッピングし、このファイルをクライアントに送信する./
」を要求する処理は、より複雑である.上のlocation"/
"にのみ一致するため、このlocationを使用して処理されます.その後、index命令は、そのパラメータと「root /data/www
」命令からなるファイルパスを使用して、対応するファイルが存在するか否かを検出する.ファイル/data/www/index.html
が存在せず、/data/www/index.php
が存在する場合、このコマンドは、クライアントから送信されたように、内部リダイレクトを実行し、nginxは「/index.php
」に一致するlocationを再検索します.前に見たように,このリダイレクト要求は最終的にFastCGIサーバに渡されて処理される.