web-dev-qa-db-ja.com

Laravel 5 Cache-Control HTTPヘッダーをグローバルに設定する方法?

私のLaravelアプリケーションは、サイトごとにデフォルトでCache-Control: no-cache, private HTTPヘッダーを返します。この動作を変更するにはどうすればよいですか?

PS:session.cache_limiterをempty/publicに変更しても何も変更されないため、これはPHP.iniの問題ではありません。

10
manifestor

Laravel 5.5 <

あなたはそのためのグローバルミドルウェアを持つことができます。何かのようなもの:

<?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
];
12
Khalid Dabjan

Laravel 5.6以降

独自のカスタムミドルウェアを追加する必要はありません。

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
12
andrewtweber

より少ないコードを記述する方法を求める人のために、追加の手順なしで応答にヘッダーを追加できる別の方法を次に示します。

上記の例では、ルートがエンドユーザーのブラウザーにキャッシュされないようにするミドルウェアを作成しました。

<?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",
        ]);
    }
}

出典: 応答へのヘッダーの添付

0
Anwar