概要
Laravelの↓で紹介されているNginxの設定でなぜ動くのかの解説
https://readouble.com/laravel/5.8/ja/deployment.html
解説
location / 部分の設定
↓の部分の try_files の役割は下記の通りになっている。
- $url にファイルがあるか
- $url/(/で終わるファイルパスなので、要はディレクトリ)にディレクトリがあるか
- ↑がなければ、/index.php$query_string へ内部リダイレクトする
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ 部分の設定
基本的に location / の結果としてindex.phpになって内部リダイレクトされている前提になる。
index.phpで内部リダイレクトされるので、location ~ \.php$ にマッチする。
あとは、location ~ \.php$の設定に従い、php-fpmを経由してLaravelの開始スクリプトのindex.phpが実行されるという流れ。
ちなみに、↓部分は、Laravelがいるサーバ(=php-fpmが起動しているサーバ)のLaravelのindex.phpのパスを指定されていれば良いので、
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
Laravelのindex.phpが /laravel/public/index.php にいる場合、↓のようにベタ書きしても動く。
fastcgi_param SCRIPT_FILENAME /laravel/public/index.php;
余談1
ベタ書きした場合でもSCRIPT_FILENAMEの末尾には$query_stringは不要
※Laravel側でちゃんとパラメータは取れる
location /の
try_files $uri $uri/ /index.php?$query_string; を
↓
try_files $uri $uri/ /index.php;
にするとLaravelにパラメータが来なくなる。
余談2
下記の状態の場合、
リクエスト:http://localhost/aa?aaaa=123
root:/usr/share/nginx/html/
location ~ \.php$に来た時、↓になる。
$realpath_root:/usr/share/nginx/html
$fastcgi_script_name:index.php
$query_string:aaaa=123
※$query_stringはphp-fpmに渡す必要ないけど