【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;
}
}