之前有写过Cloudflare Page Rules缓存全站的用法,但是遇到像部分页面不能缓存(类似于动态获取参数等)的时候,Page Rules设置就不够灵活了,而且cloudflare免费账户的3条Page Rules规则,明显不够用,我们就需要配合Cache Rules来使用。
Cache Rules比Page Rules的设置更加灵活方便,而且免费账户支持10条规则。
使用Cache Rules之前,需要先搞清楚它与Page Rules之间的区别:
- Cache Rules的优先级高于Page Rules。也就是说,如果Cache Rules中的规则与Page Rules冲突,Cache Rules规则会覆盖Page Rules规则。这就非常适合上面说的情况,用Cache Rules来排除某些不需要缓存的页面。
- Cache Rules规则从上往下,权重是递增的。也就是说,如果规则有冲突,下面的规则会覆盖上面的规则。
详细说明参考Cloudflare官方:https://developers.cloudflare.com/cache/how-to/cache-rules/
下面以wordpress为例,来设置Cloudflare Cache Rules搭配Page Rules实现灵活缓存规则。相比之前的设置,做了进一步的优化。
Page Rules规则
- URL: www.168itw.com/wp-admin*
Cache Level: Bypass
Disable Performance - URL: www.168itw.com/*php*
Cache Level: Bypass
Disable Performance - URL: www.168itw.com/*
Cache Level: Cache Everything
Edge Cache TTL: a day
规则1不缓存wordpress后台。
规则2不缓存特殊动态页面,比如动态支付页面,动态API页面,这就需要根据自己的页面结构来确定URL特性;当然这里也包括了wordpress后台登录页面wp-login.php。
规则3缓存全站,包括首页,缓存时间为1天。
Cache Rules规则
以影视站点为例,我需要用nginx对电视剧频道的视频鉴权防盗链(Nginx secure_link模块给网站添加防盗链),所以该频道页面需要动态生成鉴权token,因此不能按照Page Rules规则来缓存1天。
- Rule name: tv channels cache rule
When incoming requests match…
URI Path – Contains – /tv And
Hostname – equals – www.168itw.com
Cache status
Bypass cache
Browser TTL
Respect origin - Rule name: css & js & woff & img cache rule
When incoming requests match…
(http.request.uri contains ".css") or (http.request.uri contains ".js") or (http.request.uri contains ".woff") or (http.request.uri contains ".jpg") or (http.request.uri contains ".png") or (http.request.uri contains ".svg") or (http.request.uri contains ".gif") or (http.request.uri contains ".bmp") or (http.request.uri contains ".ico")
Cache status
Eligible for cache
Edge TTL
7 days
Browser TTL
Override origin – 1 day
这里需要说明下:
规则1中Browser TTL设置为Respect origin,即浏览器缓存,按照默认的浏览器缓存设置来,默认设置在cloudflare的Caching – Configuration中,默认是30minutes,你也可以根据需要来修改。因为我的nginx鉴权设定为3小时,所以用户浏览器缓存30分钟是完全没问题的。
规则2是缓存css、js、woff字体、jpg等图片,因为规则1排除了tv目录下所有页面的缓存,但是这些页面上的静态资源是可以缓存的;当然,该条规则也会覆盖掉Page Rules中对于静态规则的缓存设置,因为它的优先级比较高。