Laravel5.4 で 301 Redirect した時の挙動

目的

  • ある特定のページを301 redirect させて、UnitTest を Pass させる
  • Test をしているのは、Redirect ページであるため、実際に遷移したかどうかまで確認出来ていない
    • Redirect ページから、正しくページ遷移されたかどうか Test を書きたいが、今はこれで必要十分

routes/web.php

<?php

Route::get('/sample', function() {
    return redirect('/memo', 301);
});

tests/Unit/MemoControllerTest.php

<?php

namespace Tests\Unit;

use Tests\TestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class MemoControllerTest extends TestCase
{
    public function testMemoIndex()
    {
        $response = $this->get('/sample');

        $response->assertStatus(301);

        $response->assertSee('<meta http-equiv="refresh" content="0;url=http://localhost/memo" />');

    }
}

redirect(‘/memo’, 301) と書いた時の内部的な動き

  • 下のような redirect 用のページが生成される(Laravelが自動的に生成)
  • page の中には 0秒で対象ページ(memo) にリダイレクトするよう、meta属性で定義
<html>
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="refresh" content="0;url=http://localhost/memo" />

        <title>Redirecting to http://localhost/memo</title>
    </head>
    <body>
        Redirecting to <a href="http://localhost/memo">http://localhost/memo</a>.
    </body>
</html>

疑問点

  • 環境によって、meta タグ内の content=x が 0秒 / 1秒 と異なる。これが異なる理由が不明。

所感

  • できればページ遷移した後の content をチェックして true を返すような Test に書き換えたい
  • まさか内部的に Redirect 用のページを挟んでいるとは思ってもいなかったので、Test によって Framework の理解が少し深まった。

全然関係ないけど

Hatena の Markdown で言語を引用する場合、<?php ってかかないとPHPと認識されないみたい。
たしかに class だけ書いてたらわからないよね。