Laravel 5 如何全局设置缓存控制 HTTP 标头?拉拉维尔 5.6+拉拉维尔 5.5 <

2022-08-31 00:10:37

默认情况下,我的Laravel应用程序为每个站点返回HTTP标头。如何更改此行为?Cache-Control: no-cache, private

P.S.:这不是PHP.ini问题,因为更改为空/公共不会改变任何东西。session.cache_limiter


答案 1

拉拉维尔 5.6+

不再需要添加自己的自定义中间件。

中间件与Laravel一起开箱即用,别名为SetCacheHeaderscache.headers

这个中间件的好处是它只适用于和请求 - 它不会缓存或请求,因为你几乎从来不想这样做。GETHEADPOSTPUT

您可以通过更新您的 :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');
    Route::get('another-route', 'MyController@alsoCached');
    Route::get('third-route', 'MyController@alsoAlsoCached');
});

请注意,这些选项由分号而不是逗号分隔,连字符由下划线替换。此外,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

答案 2

拉拉维尔 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
];

推荐