私のLaravelアプリケーションは、サイトごとにデフォルトでCache-Control: no-cache, private
HTTPヘッダーを返します。この動作を変更するにはどうすればよいですか?
PS:session.cache_limiter
をempty/publicに変更しても何も変更されないため、これはPHP.iniの問題ではありません。
あなたはそのためのグローバルミドルウェアを持つことができます。何かのようなもの:
<?php
namespace App\Http\Middleware;
use Closure;
class CacheControl
{
public function handle($request, Closure $next)
{
$response = $next($request);
$response->header('Cache-Control', 'no-cache, must-revalidate');
// Or whatever you want it to be:
// $response->header('Cache-Control', 'max-age=100');
return $response;
}
}
次に、これをグローバルミドルウェアとしてカーネルファイルに登録します。
protected $middleware = [
....
\App\Http\Middleware\CacheControl::class
];
独自のカスタムミドルウェアを追加する必要はありません。
SetCacheHeaders
ミドルウェアは、cache.headers
として別名が付けられたLaravelに付属しています
このミドルウェアのいいところは、GET
およびHEAD
リクエストにのみ適用されることです。これは、POST
またはPUT
リクエストをキャッシュすることはほとんどありません。
RouteServiceProvider
を更新することで、これをグローバルに簡単に適用できます。
protected function mapWebRoutes()
{
Route::middleware('web')
->middleware('cache.headers:private;max_age=3600') // added this line
->namespace($this->namespace)
->group(base_path('routes/web.php'));
}
protected function mapApiRoutes()
{
Route::prefix('api')
->middleware('api')
->middleware('cache.headers:private;max_age=3600') // added this line
->namespace($this->namespace)
->group(base_path('routes/api.php'));
}
それはお勧めしません。代わりに、他のミドルウェアと同様に、特定のエンドポイント、グループ、またはコントローラー自体に簡単に適用できます。例:
Route::middleware('cache.headers:private;max_age=3600')->group(function() {
Route::get('cache-for-an-hour', 'MyController@cachedMethod');
});
オプションはコンマではなくsemicolonで区切られ、ハイフンは下線に置き換えられます。また、symfonyは 限られた数のオプション のみをサポートします:
'etag', 'last_modified', 'max_age', 's_maxage', 'private', 'public', 'immutable'
つまり、標準のCache-Control
ヘッダー値を単にコピーして貼り付けることはできません。フォーマットを更新する必要があります。
CacheControl format: private, no-cache, max-age=3600
->
Laravel/Symfony format: private;max_age=3600
より少ないコードを記述する方法を求める人のために、追加の手順なしで応答にヘッダーを追加できる別の方法を次に示します。
上記の例では、ルートがエンドユーザーのブラウザーにキャッシュされないようにするミドルウェアを作成しました。
<?php
class DisableRouteCache
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request)->withHeaders([
"Pragma" => "no-cache",
"Expires" => "Fri, 01 Jan 1990 00:00:00 GMT",
"Cache-Control" => "no-cache, must-revalidate, no-store, max-age=0, private",
]);
}
}
出典: 応答へのヘッダーの添付