問題点
- grav と呼ばれる軽量 CMS を利用してサイトを立ち上げたところ、トップページ
例: http://ドメイン/
は正常に表示されるが、サブフォルダ例: http://ドメイン/blog
が 404エラーになってしまう問題が発生。 - 構成:
- それぞれのバージョンは以下
- nginx 1.14
- php 7.2
原因
原因のコード
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php index.html index.htm;
server_name _;
location / {
try_files $uri $uri/ =404; # <--ここで 404 判定されている
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
}
- php-fpm に処理を渡す前に nginx が 404 を返却している、ということから、
location /
内で 404 に判定されてしまっている、ということになる。
対処
対処方針
- grav は、/blog とリクエストされると、いったん /index.php が処理を受け取って内部処理を行う流れになっている
- とにかく php-fpm に処理を渡さないことには話にならないので、処理を渡すこと、そして、処理用のスクリプトは index.php であることを明示させておく。
対処コード
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php index.html index.htm;
server_name ドメイン;
location / {
try_files $uri $uri/ @grav;
}
location ~ \.php$ {
try_files $uri $uri/ @grav;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
location @grav {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME /var/www/html/index.php;
include fastcgi_params;
}
}
解説
-
location /
で 対象のファイルが存在しなかった場合、処理を@grav
に渡すように変更 -
location @grav
にて、php-fpm を動作させる。その際にパラメータとしてSCRIPT_FILENAME
で index.php が処理用スクリプトであることを明示しておく。