概要
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に渡す必要ないけど