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
默认情况下,我的Laravel应用程序为每个站点返回HTTP标头。如何更改此行为?Cache-Control: no-cache, private
P.S.:这不是PHP.ini问题,因为更改为空/公共不会改变任何东西。session.cache_limiter
不再需要添加自己的自定义中间件。
中间件与Laravel一起开箱即用,别名为SetCacheHeaders
cache.headers
这个中间件的好处是它只适用于和请求 - 它不会缓存或请求,因为你几乎从来不想这样做。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');
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
你可以有一个全局中间件。像这样:
<?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
];