利用Cloudflare的API清除缓存图文教程

如何清除Cloudflare的在线缓存呢?很多小伙伴都是直接登陆Cloudflare面板后在后台点击清除缓存。…

如何清除Cloudflare的在线缓存呢?很多小伙伴都是直接登陆Cloudflare面板后在后台点击清除缓存。但是还可以通过API进行缓存的清除操作的。这里搬主题就分享一下利用Cloudflare的API清除缓存图文教程。

因为免费版的Cloudflare只有三条缓存规则,对于一般网站来说勉强够用了,例如后台链接的缓存策略设置为绕过,某个时常更新的页面缓存策略设置为1个小时,其它不经常更新的页面缓存设置为半个月,本来我制作的网站也是按照这个策略正常运行的,直到发现最近很少收到国际友人的邮件,尤其是在上了CDN之后,一封都没有!抱着试试的心态自己在网站上填写了“联系我们”的表单,结果发现还真有问题,返回了403代码!

403是客户端有错误,导致禁止访问,当时就有种预感跟csrf_token有关,网站采用的是django框架,在配置文件中,存在一个CsrfViewMiddleware的中间件,为了防止跨站请求伪造,所以在以post请求提交form表单时,必须要验证随机数csrf_token,而由于缓存的存在,这个随机数无法通过后端的验证,所以一直返回403(但是在清除缓存之后,还是可以暂时正常提交表单,因为csrf验证通过)。

尝试按照django官网的教程,使用csrf_exempt装饰器标记视图,使其不受CSRF保护,官网对于csrf_protect的解释:

This decorator marks a view as being exempt from the protection ensured by the middleware.

复制

但是在我实际测试中,下面这种方法不可行

from django.views.decorators.csrf import csrf_exempt
class ContactUsView(View):
  ...
  @csrf_exempt
  def post(cls, request):
      ...

但也有可能是我的方法不对,因为django中装饰类,似乎和函数不同,需要装饰dispatch函数,这个后面再来测试吧。

from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required

@method_decorator(login_required, name='dispatch')
class ProtectedView(TemplateView):
    template_name = 'secret.html'

总之,就是因为这个原因导致联系我们的表单需要占据一个缓存“绕过”的策略,导致网站时常更新的那个页面策略随大流也缓存了半个月,这可真是太不友好了,现在就剩两种解决办法,一种很简单,花钱!升级下一个版本pro就会多达20个(这个数量不确定)缓存规则;或者辛苦点每隔2个小时清除一次该页面的缓存。

查阅CF的官方文档,确实提供了API方便用户清理缓存,主要有三种,分别是清除所有缓存文件“Purge All files”,单个缓存文件“Purge Files by URL”,还有第三种,根据域名、前缀、缓存标签来清除“Purge Files by Cache-Tags, Host or Prefix”。第一种,全站清缓存,没啥好写的,在CF控制台点一下就可以,没必要利用API;第三种方法只能用于企业版,由于价格原因我也不会去用它,没去了解;主要就是第二种清除单个url可以解决我的问题。

先来看下CF的官方文档,第一眼看的一脸懵逼,后来琢磨了下,算是搞清楚了,首先这个功能FREE版本是可用的,要求该账号有#cache_purge:edit权限,使用的方法是发送POST请求,然后需要一个Zone ID标识符(identifier)

首先打开个人资料,选择API令牌中的Global API Key,这个钥匙的作用如下,其实就是在请求时放在头部的X-Auth-Key

The Global API Key is an all purpose token that 
can read and edit any data or settings 
that you can access inthe dashboard.

获知到这个X-Auth-Key之后,找个可以使用curl请求的命令行窗口,输入以下请求向CF请求你账号的权限有哪些

curl -X GET "https://api.cloudflare.com/client/v4/zones" 
  -H "X-Auth-Email: youraccount@gmail.com" 
  -H "X-Auth-Key: Global API Key" 
  -H "Content-Type: application/json"

可以看到我的账号permissions确实存在#cache_purge:edit权限,(当然,返回的json内容很多,可以将其格式化后自行了解) ‍

那么接下来的操作就没有问题了,找到自己域名下面的Zone ID

然后使用如下命令清除缓存链接,下面的data后面其实是一行,为了看的清除,我将其分了几行,将下方的zone_id、账号、全局钥匙、实际想清除缓存的链接填入进去,就可以正常使用了

curl -X POST "https://api.cloudflare.com/client/v4/zones/zone_id/purge_cache" 
     -H "X-Auth-Email: youraccount@gmail.com"      
     -H "X-Auth-Key: Global API Key"      
     -H "Content-Type: application/json"      
     --data '{"files":
     ["https://will_purge_cache_page.com",
     {"url":"https://domain.com",
     "headers":{"Origin":"https://www.cloudflare.com","CF-IPCountry":"US","CF-Device-Type":"desktop"}
     }]}'

在这里得吐槽一下CF,首先清除缓存的是紧接着files后面列表的第一个链接will_purge_cache_page.com,无法在列表中增加多个链接,这就意味着如果想要清除多个链接,必须发送多次post请求;第二,这个url参数对应的键值对https://domain.com没搞清楚是什么作用,必须要是同一个域名下,但是实测中不会被清除缓存,而且必须存在,否则清除单个页面缓存会报错!

另外:

文档路径(https://developers.cloudflare.com/cache/how-to/purge-cache/)

关于开发者中心里面存在的清除缓存教程“Purge cache key resources”,要求的是zone_tag,并非Zone ID,所以这种方法是无法使用的。

接下来的事情就简单了,在服务器上写一个shell脚本,然后写入到crontab文件中,定时运行即可自动清除指定的页面缓存了。

00 */2 * * * root /bin/bash /srv/purge_cache.sh > /srv/purge.log

参考:

# 跨站请求伪造
https://zhuanlan.zhihu.com/p/22521378
# django csrf
https://docs.djangoproject.com/en/4.0/ref/csrf/
# 基于类的装饰
https://docs.djangoproject.com/zh-hans/4.0/topics/class-based-views/intro/#id1
# CF help
https://api.cloudflare.com/#zone-purge-all-files
类别:WordPress 进阶教程

本文收集自互联网,转载请注明来源。
如有侵权,请联系 wper_net@163.com 删除。

评论 (0)COMMENT

登录 账号发表你的看法,还没有账号?立即免费 注册