読者です 読者をやめる 読者になる 読者になる

Laravel 5 URLの末尾/( スラッシュ )でリダイレクトさせない設定

php laravel

ブラウザのクライアントアプリがFlash(.swf)で動いているアプリを Laravelで書き換え中。
Flashのアプリは、末尾にスラッシュがついたリクエストをサーバーに送ってくる(HTTPのPOST) 。
Laravel5は、末尾にスラッシュがあると、リダイレクトさせてしまう上に、リダイレクトのアクセスは、HTTPのGETなので、うまく動かない。
Flashのアプリは書き換えずにサーバー側だけをZendからLaravelに移行できるか試したいので、
末尾にスラッシュがあってもリダイレクトされないようにしたい。

http://test1.localhost.jp/api/Group/getList/

↑のようなURLで動くようにしたい。

laravelでトレイリングスラッシュを有効にする方法 - Qiita
末尾のスラッシュは、トレイリング・スラッシュと呼ぶらしい。初めて知った。
↑のページの修正方法を試したけど、動かなかった。

htaccessのオプション?一覧
mod_rewriteまとめ(3)mod_rewriteで使えるフラグ

設定方法

RewriteRule ^(.*)/$ /$1 [L,R=301]
という行の
[L,R=301]
を消したら思ったように動いた。

元の.htaccess

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

修正後の.htaccess

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1  # modified

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

メモ

途中で、
RewriteRule ^(.*)/$ /$1 [N]
のように[N] オプションを付けたら、無限ループに入ったっぽくて、
apacheがCPU100%状態になった。
[N] オプションは、Rewriteのルールを上からやり直すオプションらしい。
[L] を付けなければ、後続のルールも適用されるっぽい。