我的Laravel应用程序正在为每个站点返回默认的缓存控制:无缓存、私有
HTTP头。我怎样才能改变这种行为?
附言:这不是PHP. ini问题,因为将
session.cache_limiter
更改为空/公共不会改变任何事情。
对于那些寻求编写更少代码的人,这里有另一种方法可以在响应中添加头,而无需额外步骤。
在上面的示例中,我创建了一个中间件,以防止路由缓存在最终用户浏览器中。
<?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",
]);
}
}
来源:将标题附加到响应
您可以为此使用一个全局中间件。比如:
<?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
中间件附带了Laravel,别名为cache。标题
这个中间件的好处是它只适用于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'));
}
但我不建议这样做。相反,与任何中间件一样,您可以轻松地应用于特定的endpoint、组或控制器本身,例如:
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'
换句话说,您不能简单地复制和粘贴标准的缓存控件
标题值,您需要更新格式:
CacheControl format: private, no-cache, max-age=3600
->
Laravel/Symfony format: private;max_age=3600
我有一个问题与超文本传输协议头-缓存控制:max-age=1234我的源有那个头,但任何方式发送请求和接收304.我需要可能我错过了什么?还有一个,源除了缓存控制: max-age=1234在"响应头"有缓存控制: max-age=0在"请求头",可能是它的影响。 我的一个资源响应标题,示例: > 远程地址:10.6.237.13:443请求请求方式:GET状态码:304未修改
问题内容: 我有一个带有多个控制器的webapp。我在一个控制器中(通过)在回调中设置服务的默认标头。但是,这些标头不会在其他控制器的后续调用中设置。是否必须为我拥有的每个控制器设置一次,或者一次设置足够? 问题答案: 您应该使用以下两种方法之一: 在运行块中设置$ http.defaults.headers 使用拦截器
问题内容: 在基于注释的Spring MVC控制器中,为特定路径设置缓存头的首选方法是什么? 问题答案: org.springframework.web.servlet.support.WebContentGenerator,这是所有Spring控制器的基类,有很多处理缓存头的方法: 它们可以在内容生成之前在控制器中调用,也可以在Spring上下文中指定为bean属性。
在nginx中使用add_header指令时,会将该头添加到来自源服务器的响应中。 假设源服务器返回缓存控制公共,最大年龄=60。但在nginx反向代理位置中,您可以设置如下内容: 添加\u头缓存控制公用,最大年龄=10 这到底是做什么的?我可以想到两种不同的情况: 1)Nginx尊重来自源服务器的缓存控制报头,并将内容存储在其缓存中,过期时间为60秒。然后传递带有覆盖标头的响应,导致客户端将资源
我试图设置缓存控制的任何静态资源(图像,js,css)在我的网站。我使用的是Spring4(带有Spring Security)和Tomcat8服务器。 我已经尝试在web.xml中设置ExpiryFilter 谢谢你。
我已经在一台主机上安装了一个带有NGINX的Ubuntu实例,并将其配置为另一台主机上我的应用程序的转发代理。我的应用程序正在向NGINX发出GET请求,NGINX正在向外部服务器发出另一个GET请求(请求中指定了指向此服务器的URL),并将响应返回给应用程序。NGINX应该缓存来自外部服务器的响应。我需要尊重响应中的缓存控制头(缓存该头所说的响应),但是!当响应中没有缓存控制头时,必须缓存12小