当Form API生成表单时,它还会生成一个令牌,该令牌与该表单一起在隐藏字段中传递出去,并有望返回。如果是,将处理该表单。
如果渲染的表单曾经被Varnish缓存过,则该机制就会中断。提交表单的第一个用户将使用令牌,并且随后尝试使用该表单的请求将被拒绝。
有哪些策略可用于在缓存其呈现的表单时保持其正常工作?
当Form API生成表单时,它还会生成一个令牌,该令牌与该表单一起在隐藏字段中传递出去,并有望返回。如果是,将处理该表单。
如果渲染的表单曾经被Varnish缓存过,则该机制就会中断。提交表单的第一个用户将使用令牌,并且随后尝试使用该表单的请求将被拒绝。
有哪些策略可用于在缓存其呈现的表单时保持其正常工作?
Answers:
我在网站上使用BOA,但默认情况下,BOA只是为表单提交即时禁用了前端缓存。除了我的实际经验之外,我还碰到了一个只有一岁的人,他讲述了《新西兰邮报》如何处理Drupal&Varnish和表单令牌问题。真正的John Wayne,它是Drupal缓存必读的书。仅关注表单问题:
难题的最后一部分是Cookie缓存绕过高级模块,该模块会在用户每次在网站上提交POST表单时自动设置特殊的NO_CACHE cookie,其中包括登录表单。我们的Varnish配置为在看到Cookie时绕过页面缓存(而不是ESI缓存)。
当在form_alter(unset($ form ['#token']);)或($ form ['#token'] = FALSE;)中不需要XSRF生产时,也可以禁用表单令牌。
Acquia Drupal的性能文章提出了Drupal模块Authcache,但是阅读了Authcache上的文档,它使用表单的占位符计算了缓存(不缓存表单):
Authcache尝试拦截任何自定义的内容并在HTML中设置占位符。然后,在加载页面之后,将使用Ajax回调检索自定义数据并填写占位符,以动态更新页面HTML。
当前的Authcache占位符:表单令牌(仅已登录的用户; Drupal要求提供,以防止跨站点请求伪造攻击)
策略是,缓存除form之外的所有内容。那么解决所有其他问题:也许根本不使用Varnish,Memcache和Redis?我的策略是使用BOA提供的功能,因为我使用BOA并且其背后的向导(omega8.cc)比我了解的更多。我不认为有外部缓存可以解决问题。他们似乎都绕过了表格。
使用前面提到的authcache以及经过微调的“视图和面板”进行部分缓存,如NZ Post文章中所述,并由Wunderkraut的大脑信任组织描述过 -它已经过时了,但是解决了这个问题。
使用Drupal ESI模块,并且Varnish部分符合ESI):
ESI(或Edge Side Includes)是针对身份验证用户的高性能缓存解决方案,但对匿名用户也有帮助。
通常,对经过身份验证的用户进行个性化设置的页面(即使是较小的个性化设置,例如显示“ Manarth登录”的代码块)也可以防止反向代理(其执行速度可能比Drupal快100倍),这是因为消息然后可以被另一用户看到为一个用户准备的内容。
希望那对您有所帮助。
一种可能的解决方案是将令牌与一起全部禁用$form[‘#token’] = FALSE;
,然后覆盖提交回调,而不是实际发布评论,使用令牌重新生成原始表单,然后要求用户确认该帖子。
如果用户支持ECMAScript,则可以通过拥有一种服务资源来改善用户体验,该资源公开新表单令牌的表单生成并将相关表单插入form_cache
。然后,一旦用户将注意力集中在表单上,并因此可能想要提交,就禁用提交按钮,获取新令牌并将其插入已呈现的表单中,然后再次启用提交按钮。