名前ベースのバーチャルサーバだとサーバ毎に証明書が必要となってしまうので、LaravelのプロジェクトをサブディレクトリのURLで公開したいと思いました。一通り設定して _ttp://hoge.com/subdir で接続すると「NotFoundHttpException」となってしまいます。お尻にスラッシュ「/」をつけて _ttp://hoge.com/subdir/ とすると動作します。

環境は以下の通りです。

  • CentOS 6.8
  • Nginx 1.10.2
  • PHP 5.6
  • PHP-FPM 5.6.29
  • Laravel 4.2

Nginxの設定は以下の通りです。
/etc/nginx/conf.d/subdir.conf

server {
    listen 80;

    server_name hoge.com;

    error_log /var/log/nginx/error.log notice;
    rewrite_log on;

    # Remove trailing slash to please routing system.
    rewrite ^    (.+)/$ $1;

    location /
    {
        try_files $uri $uri/ /index.html /index.php?$query_string;
    }

    location ~ ^/index.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_split_path_info ^(.+\.php)(.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
    }

    # For subdir
    location ~ ^/subdir(/(.+))?$ {
        root /var/www/Code/subdir/public;

        try_files $1 /subdir/index.php?$query_string;

        location ~ ^/subdir/index.php$ {
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root/index.php;
            fastcgi_split_path_info ^(.+\.php)(.+)$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
        }
    }
}

github上に laravel42-starter-kit というのがあって、これで試すとお尻スラッシュ付けなくても動作します。「laravel42-starter-kit」ではSymfony関連のパッケージがほとんど「2.5」となっていましたが、私のアプリでは「2.7」となってました。「laravel42-starter-kit」で無理やり「composer update」するとSymfony2.7となり、お尻スラッシュのURLリクエストで同様に「NotFoundHttpException」となりました。composerでインストールされるSymfony以外のパッケージが原因かもしれませんが、ルーティングに関するエラーなので怪しいと思っています。ちなみにLaravel4.2と5.1を素の状態でインストールしても、最初のデモ画面の表示で同様のNG状態となりました。
Nginxの設定で回避できるのか、アプリのcomposerパッケージをなんとかするか、はたまたLaravelの設定やアプリコード修正で対応するか、どれでアプローチすべきか悩んでます。XDebugで追ってみましたが、初心者なもので原因にたどり着けませんでした。

どなたか解決策をご存知の方や同様の問題を抱えられてる方がおられましたら、回答よろしくお願いいたします。