概要
ログインした後にブラウザバックするとブラウザキャッシュが残っててログイン画面が表示されてしまうとかそういう時の対策です。
環境
- 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']);
});
開発者ツール見てヘッダーが反映されてることを確認します。
追記
@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']);
});
ミドルウェアを自前で用意しなくてもレスポンスヘッダーを指定できました。