首页 > 解决方案 > 允许 Cloudflare 从 Laravel 缓存我的索引页面

问题描述

我面临一个疯狂的问题,我有一个网站正在生产中运行,我正在尝试使用 cloudflare 的“页面规则”缓存我的索引页面以加快速度,它现在没有动态内容。

问题是它不起作用可能是因为 laravel 总是返回带有 XSRF-TOKEN 的视图,而 cloudflare 会将其理解为不可缓存,我已经更改了标题(缓存控制:max-age=36000,公共)但 cloudflare当它应该返回 HIT 时,总是返回标题“cf-cache-status: BYPASS”。

当我尝试对来自 laravel 公共文件夹的文件(视图的相同 php 文件)使用相同的规则时,它可以正常工作并返回 HIT。

我能想到的解决方案是尝试从标头响应中删除这个 XSRF-TOKEN,但我对如何做到这一点感到很疯狂,有什么提示吗?

Obs:我尝试使用删除这些cookie

            \Config::set('session.driver' , 'array');
            \Config::set('cookie.driver', 'array');

但这只会删除一个 cookie 而不是 XSRF-TOKEN 一个。

标签: laravellaravel-5cookiescloudflaresetcookie

解决方案


我相信您必须在要缓存的页面上删除 CSRF 令牌,或者实施某种 JavaScript 解决方案,在您需要 CSRF 令牌的时候请求它。

我发现这篇文章解释了你的情况(文章底部):

https://blog.cloudflare.com/the-curious-case-of-caching-csrf-tokens/

如果您确定您的页面不需要 CSRF 令牌(即它不包含任何 POST/PUT/DELETE 功能),您可以删除该特定页面的令牌并没问题。

在 Laravel 中,CSRF-token 由 管理\App\Http\Middleware\VerifyCsrfToken,它应该在你的中间件中列出\App\Http\Kernel。删除此中间件将删除所有使用该中间件的路由;因此,您可能必须为确实需要 CSRF 保护的页面创建一个单独的中间件组。

您可能还可以添加到中间件类的protected $except = []属性中。VerifyCsrfToken此属性包含应从 CSRF 验证中排除的 url 数组。所以你可以添加'/'到那个数组,或者像'/webhook/*'.


推荐阅读