🐡

サブディレクトリに設置したLaravel8(CentOS7 + Nginx)で、ルーティング先だけが404|NOT FOUNDになる場合

2023/10/18に公開

問題

Laravelで表示させたいURL: example.com/stg/
Laravelインストール先: /usr/share/nginx/html/stg/
サーバー: さくらのクラウド CentOS7.9

ググって先人のブログを参考にdefault.confを書き換えてみた結果、

TOPページ : example.com/stg/ → ページ表示成功
ルーティング先 : example.com/stg/hoge/ → 404 | NOT FOUND

ローカル開発環境では問題がないのに、なぜかLaravel側からTOPページ以外で404エラーを返してきた。

解決方法

やはりdefault.confの指定に問題がありました。ちゃんとLaravel公式からコピペしてきて、メインディレクティブとサブディレクティブのところだけを書き換えたところ、無事に解決した。

Laravel公式

default.conf
server {
    listen 80;
    server_name  example.com;
    
    #①publicディレクトリのパスを変更
    root /usr/share/nginx/html/stg/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        root /usr/share/nginx/html/stg;
        #②example.com/では静的なindex.htmlを表示させる
        index index.html;
    }

    #③サブディレクトリのディレクティブを追加(example.com/stg/location /stg {
        try_files $uri $uri/ /index.php?$query_string;
    }

    #④ついでにビルドしたcss/jsファイルも
    location /build {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /404.html;
    
    location ~ \.php$ {
        
        #⑤クラウドサーバーのphp-pfmにあわせて変更
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Discussion