LaravelでPOSTのルーティングが上手く行かなかったとき

投稿者: | 2017年6月5日

LaravelのルーティングでPOST渡しが上手くいかなかったときのメモです。

まず下記のようなフォームを作りました。

<form method="post" action="/user/register/">

 そして下記のようなルーティングをLaravelに設定しました。

Route::group([], function () {
    Route::get('/user/register/', 'UserController@getRegister');
    Route::post('/user/register/', 'UserController@postRegister');
});

 getRegisterメソッドでフォームを表示し、postRegisterメソッドでフォームの内容を受け取るといった具合です。
まあ、こんな基本的なこと楽勝なはずですよね。

しかし、上手く行かない・・・

何回やってもフォームから送信するとgetRegisterが呼び出されてしまいます。
フォームがちゃんとPOSTで送信されていないのか?どうなってんじゃーとApacheのログを調べてみると次のようになってました。抜粋です。

POST /user/register/ HTTP/1.1" 301
GET /user/register HTTP/1.1" 200

 ん?ちゃんとPOSTで送信されている。
しかし、301でリダイレクトされて、再び同じページに遷移しています。
よくよく見てみると最後のスラッシュが消されています。

調べてみると、LaravelはURLの最後にスラッシュがあると、消してリダイレクトしてしまうんですね。
そこで下記のようにフォームを修正したら、無事解決しました。

<form method="post" action="/user/register">

 
いやー、思わぬところで苦戦してしまいました。
ちなみにURLの最後のスラッシュを「トレイリングスラッシュ(trailing slash)」と呼ぶらしいです。