【Laravel】URLが長い場合は専用ページを表示するようにする方法
こんにちは、スズキです。
先日開発していた際に、
「Internet Explorerでパスに使用できる最大文字数は2048文字なので、URL文字数が2048文字を超えている場合は414ページを表示する」
という対応を行ったのですが、
今回は、その際に行った対応方法を紹介しようと思います。
手順の流れとしては
Middleware作成
→Middlewareをルートに登録
→Middlewareが呼ばれた際にURL文字数を調べ、URL文字数が長い場合は専用ページを表示
という流れになります。
まずはMiddlewareを作成します。
Middlewareの詳細についてはこちらのページ等を参考にしていただくと良いと思いますが、
例えば、Laravel5.1の場合は以下のようなコマンドを実行することでMiddlewareを作成することができます。
(下記コマンドを実行した場合はTestMiddlewareというMiddlewareクラスが作成されます。)
Karnel.phpを開き、$routeMiddleware変数に目的のMiddlewareを追加します。
●Karnel.php
次に、routes.phpを開き、以下のような記述を行い、各ページにアクセスする際にMiddlewareを経由するようにします。
●routes.php
今回の場合、
Kernel.phpには「'test' => TestMiddleware::class」の形で登録しているので、
routes.phpに「'middleware' => ['test']」と記載することで、
各ページにアクセスした際にTestMiddlewareが呼ばれるようになります。
TestMiddleware.phpの内容を実装し、
●TestMiddleware.php
これで、「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
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; } }