当前位置: 首页 > 知识库问答 >
问题:

Laravel 5如何设置缓存控制HTTP头全局?

郑茂材
2023-03-14

我的Laravel应用程序正在为每个站点返回默认的缓存控制:无缓存、私有HTTP头。我怎样才能改变这种行为?

附言:这不是PHP. ini问题,因为将session.cache_limiter更改为空/公共不会改变任何事情。


共有3个答案

公孙辰龙
2023-03-14

对于那些寻求编写更少代码的人,这里有另一种方法可以在响应中添加头,而无需额外步骤。

在上面的示例中,我创建了一个中间件,以防止路由缓存在最终用户浏览器中。

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

来源:将标题附加到响应

薛弘济
2023-03-14

您可以为此使用一个全局中间件。比如:

<?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
];
有凯泽
2023-03-14

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

SetCacheHeaders中间件附带了Laravel,别名为cache。标题

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

通过更新您的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小