5
7

More than 1 year has passed since last update.

Laravel ブラウザバック対策 ブラウザキャッシュさせないミドルウェアを実装

Last updated at Posted at 2023-09-01

概要

ログインした後にブラウザバックするとブラウザキャッシュが残っててログイン画面が表示されてしまうとかそういう時の対策です。

環境

  • PHP 8.0
  • Laravel 9.x

ミドルウェアを作成

app/Http/Middleware/NoCacheMiddleware.php
<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

final class NoCacheMiddleware
{
    /**
     * @param Request $request
     * @param Closure(Request): (Response|RedirectResponse) $next
     * @return Response|RedirectResponse
     */
    public function handle(Request $request, Closure $next): Response|RedirectResponse
    {
        $response = $next($request);
        $response->withHeaders([
            'Cache-Control' => 'no-store',
            'Max-Age' => 0,
        ]);

        return $response;
    }
}

Httpカーネルにミドルウェアを登録

app/Http/Kernel.php
<?php

declare(strict_types=1);

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    protected $routeMiddleware = [
        // ... 追加
        'no-cache' => \App\Http\Middleware\NoCacheMiddleware::class,
    ];
}

$middleware$middlewareGroup に登録すると全体的に適応されてしまうので、
$routeMiddleware に登録して使用したいルートだけミドルウェアを呼び出したいと思います。

使い方

routes/web.php
Route::middleware([
    'no-cache',
])->group(function (): void {
    Route::get('login', LoginController::class)->name('login')->middleware(['guest']);
});

ScreenShot 2023-09-01 17.27.34.png

開発者ツール見てヘッダーが反映されてることを確認します。

追記

@mpyw さんからコメントから公式で用意されてるのを教えてもらいました。

app/Http/Kernel.php
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,

cache.headers ミドルウェアが用意されました。

routes/web.php
Route::middleware([
    'cache.headers:no_store;max_age=0',
])->group(function (): void {
    Route::get('login', LoginController::class)->name('login')->middleware(['guest']);
});

ミドルウェアを自前で用意しなくてもレスポンスヘッダーを指定できました。

5
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7