開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. Laravel >
  5. 【Laravel】URLが長い場合は専用ページを表示するようにする方法
no-image

【Laravel】URLが長い場合は専用ページを表示するようにする方法

こんにちは、スズキです。

先日開発していた際に、
「Internet Explorerでパスに使用できる最大文字数は2048文字なので、URL文字数が2048文字を超えている場合は414ページを表示する」
という対応を行ったのですが、
今回は、その際に行った対応方法を紹介しようと思います。

手順の流れとしては

 Middleware作成
→Middlewareをルートに登録
→Middlewareが呼ばれた際にURL文字数を調べ、URL文字数が長い場合は専用ページを表示

という流れになります。
 

手順1 Middleware作成


まずはMiddlewareを作成します。
Middlewareの詳細についてはこちらのページ等を参考にしていただくと良いと思いますが、
例えば、Laravel5.1の場合は以下のようなコマンドを実行することでMiddlewareを作成することができます。
(下記コマンドを実行した場合はTestMiddlewareというMiddlewareクラスが作成されます。)
php artisan make:middleware TestMiddleware
 

手順2 Middlewareをルートに登録


Karnel.phpを開き、$routeMiddleware変数に目的のMiddlewareを追加します。

●Karnel.php
class Kernel extends HttpKernel {
    protected $routeMiddleware = [
        'test' => TestMiddleware::class,
    ];
}
 
次に、routes.phpを開き、以下のような記述を行い、各ページにアクセスする際にMiddlewareを経由するようにします。

●routes.php
Route::group( ['middleware' => ['test']], function(){
    Route::get('/', ['uses' => 'HomeController@index', 'as' => 'home.index']);

    Route::group(['prefix' => '{prefecture_slug}'], function(){
        Route::get('/', ['uses' => 'PrefectureController@index', 'as' => 'prefecture.index' ]);
    });
});

今回の場合、
Kernel.phpには「
'test' => TestMiddleware::class」の形で登録しているので、
routes.phpに「'middleware' => ['test']
」と記載することで、
各ページにアクセスした際にTestMiddlewareが呼ばれるようになります。

 

手順3 URL文字数が長い場合は専用ページを表示するようにする


TestMiddleware.phpの内容を実装し、
  • URLが長い場合 → 専用ページを表示
  • 上記以外 → URLに対応したページを表示
というように処理が分岐するようにします。

●TestMiddleware.php
class TestMiddleware
{
    public function handle(Request $request, \Closure $next)
    {
        // URL文字数が上限を超えている場合
        $isOverUrlMaxLength = $this->isOverUrlMaxLength($request);
        if ($isOverUrlMaxLength) {
            // 414ページを表示
            $view = view('414', [
            ]);
            return response($view->render(), 414);
        }

        return $next($request);
    }
    
    /**
     * URLが最大文字数を超えているかを調べます。
     * @param Request $request
     * @return bool
     */
    private function isOverUrlMaxLength(Request $request)
    {
        $maxLength = 2048;

        // 文字数取得
        $fullUrl = $request->fullUrl();
        $urlLength = strlen($fullUrl);

        // 上限を超えているか調べる
        $isOver = ($urlLength > $maxLength);
        return $isOver;
    }
}
 
これで、「URL文字数が多い場合は指定ページを表示する」という処理が実装できました。
TOPに戻る