启用缓存时CloudFront+ALB返回403错误(Drupal)的修复方案
修复CloudFront缓存下Drupal CSRF Token 403错误的方案
问题核心:Drupal的CSRF Token和用户会话(对应SSESS开头的Cookie)强绑定,而你当前使用的CacheOptimized缓存策略默认不把Cookie、X-CSRF-Token这类标识用户唯一性的字段纳入缓存键规则。当CloudFront缓存了某用户的请求响应后,其他用户请求同一URL时会命中缓存,导致Drupal验证Token时因会话不匹配返回403错误。
方案1:为特定URL配置独立的无缓存行为(推荐)
- 在CloudFront分发中新增缓存行为,精准匹配触发错误的特定URL路径(比如对应的API端点)。
- 该行为的配置细节:
- 缓存策略选择
CacheDisabled,确保这类需要CSRF验证的请求跳过缓存。 - 源请求策略保持
AllViewer,保证X-CSRF-Token、Cookie等请求信息全部转发到ALB和Drupal。
- 缓存策略选择
- 原有默认行为继续使用
CacheOptimized,不影响其他请求的缓存效率。
方案2:自定义缓存策略,将会话Cookie纳入缓存键(仅适合特定场景)
如果必须对该URL启用缓存:
- 在CloudFront控制台创建自定义缓存策略,在「缓存键设置」中添加
Cookie作为缓存键属性,选择「包含指定的Cookie」并填入SSESS*(匹配Drupal的会话Cookie)。 - 同时将
X-CSRF-Token请求头加入缓存键,确保每个用户的Token请求对应独立的缓存条目。 - 将这个自定义策略应用到目标URL的缓存行为。
注意:这种方式会降低缓存命中率(每个用户会话对应一个缓存条目),仅在该URL请求量较小且必须缓存时使用。
额外验证点
- 确认Drupal前端获取的CSRF Token是当前会话的有效Token,未使用旧的缓存Token。
- 检查CloudFront的缓存TTL设置,避免长期缓存失效的响应。
内容的提问来源于stack exchange,提问作者Karen Kostanyan
相关产品推荐
相关产品推荐

