Drupal表单在提交时抛出错误

时间:2014-01-20 20:35:03

标签: forms drupal session-variables token

drupal表单在提交时抛出以下错误。表单已加载并立即提交,用户在浏览器上并不理想。

'This form is outdated. Reload the page and try again' 

我正在使用两个带有公共数据库和Web服务器(负载均衡器)的drupal节点,但是当从一个应用服务器呈现表单并且提交请求转到另一个应用服务器时,似乎出现上述错误。

我想了解表单令牌存储在哪里,我假设在数据库中。出现上述消息是因为两种情况下的表单令牌都不同,并且应用服务器假定该请求不属于同一会话。

此外,我正在使用apc缓存,因此不确定它是否与它有任何关系。

谢谢,

2 个答案:

答案 0 :(得分:1)

令牌存储在db / form缓存中,但是使用php会话ID生成,因此,据我所知,如果您在一台服务器上生成表单,然后提交给另一台服务器,它将在重新生成令牌时生成它使用不同的会话ID进行检查,因此不匹配 - 来自common.inc

function drupal_get_token($value = '') {
  return drupal_hmac_base64($value, session_id() . drupal_get_private_key() . drupal_get_hash_salt());
}

您使用什么作为负载均衡器?如果可以,您可能需要查看启用粘性会话。

答案 1 :(得分:0)

我遇到了同样的问题。负载均衡器在两个Web节点之间传播流量。 Drupal会偶尔给我drupal_validate_form。在一个Web节点上生成表单但提交给另一个Web节点时会发生错误。

我首先查看$form_state['values']['form_token'],其中(除其他事项外)根据drupal_valid_token中存储的表单令牌验证提交的表单。跳到drupal_get_token然后转到drupal_get_hash_salt()。函数$drupal_hash_salt结果在两台服务器上返回不一致的结果。

由于某种原因,$drupal_hash_salt仅在其中一台服务器上设置。在未设置的服务器上,Drupal将根据数据库设置回退生成salt。

通过将settings.php中的Getinstance()设置为相同的值,问题得以解决。