Laravel 5.6+
There's no longer any need to add your own custom middleware.
The SetCacheHeaders
middleware comes out of the box with Laravel, aliased as cache.headers
The nice thing about this Middleware is that it only applies to GET
and HEAD
requests - it will not cache POST
or PUT
requests since you almost never want to do that.
You can apply this globally easily by updating your 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'));
}
I don't recommend that though. Instead, as with any middleware, you can easily apply to specific endpoints, groups, or within the controller itself, e.g.:
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');
});
Note that the options are separated by semicolon not comma, and hyphens are replaced by underscores. Also, Symfony only supports a limited number of options:
'etag', 'last_modified', 'max_age', 's_maxage', 'private', 'public', 'immutable'
In other words you can't simply copy and paste a standard Cache-Control
header value, you will need to update the formatting:
CacheControl format: private, no-cache, max-age=3600
->
Laravel/Symfony format: private;max_age=3600
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…