Magento 2 Commerce中Fastly缓存如何识别用户会话变更及实现权限控制
问题1解答
Magento Cloud 预装的Fastly默认内置了固定的VCL缓存规则,默认计算缓存键时仅读取 X-Magento-Vary Cookie 中默认的上下文参数(客户组ID、登录状态、货币、商店视图等),你仅在Magento侧修改Magento\Framework\App\Http\Context::getVaryString()的返回值,没有同步修改Fastly侧的VCL逻辑将自定义的访问状态参数纳入缓存键计算,Fastly依旧会用旧的规则匹配缓存,自然不会生效。
而切换账号时Magento会自动刷新X-Magento-Vary Cookie的默认参数值,刚好匹配Fastly的默认缓存键规则,所以可以正常识别会话变更。
另外你添加的自定义X-Magento-Tag默认不会被Fastly的自动清除逻辑覆盖,后台修改权限时没有主动触发对应标签的缓存清除,也是操作不生效的原因之一。
问题2解答
有三种可落地的实现方案:
- 方案1:使用ESI(Edge Side Includes)拆分页面,将权限校验的逻辑封装为独立的ESI块,设置该块不缓存或缓存时间不超过10s,每次用户请求页面时,Fastly会单独回源请求ESI块校验权限,其余页面内容保留正常缓存规则即可,平衡性能和需求。
- 方案2:在Fastly中配置自定义边缘字典,每次后台修改客户组产品权限时,同步将权限规则更新到边缘字典中,添加自定义VCL逻辑,请求产品页时先读取边缘字典判断当前客户组是否有权限访问,无权限直接返回403,无需回源,性能最优。
- 方案3:后台添加权限变更钩子,修改客户组产品权限后,主动调用Fastly API清除对应客户组+对应产品的所有缓存标签,用户刷新页面时会回源获取最新的权限校验结果。
问题3解答
Fastly默认识别Magento会话变更的逻辑是依赖X-Magento-Vary Cookie:用户登录/登出时,Magento会基于当前会话的上下文参数生成哈希值写入该Cookie,Fastly计算缓存键时会将该Cookie的值作为拼接因子,不同的Cookie值对应不同的缓存副本,因此切换账号时会自动匹配新的缓存。
该逻辑可以复用,你需要补全两个缺失的步骤:
- 不要仅修改
getVaryString的before插件,而是将自定义的访问状态参数正式注册到Magento的HTTP上下文默认参数中,确保X-Magento-VaryCookie生成时已经包含该参数的哈希值。 - 在Magento Cloud后台上传自定义VCL片段,修改Fastly的缓存键计算规则,将自定义的上下文参数纳入计算范围,保证Fastly可以区分不同权限状态的缓存副本。
同时补充权限变更时的缓存清除逻辑即可实现需求。
内容的提问来源于stack exchange,提问作者Bob Lee
相关产品推荐
相关产品推荐

