当 CloudFront 后面的表单验证失败时,用户将被发送到根目录而不是返回表单

When form validation fails behind CloudFront, user is sent to root rather than back to form

我在负载均衡器后面的两台服务器上有一个 SilverStripe 网站 运行,在 CloudFront 后面。 Redis 存储会话信息,我有一个同步任务可以同步所有需要的资产。所有这些都工作正常。

我有一个包含各种必填字段的表单。当表格填写正确时,它可以正常工作并将人员引导到正确的位置。但是,如果用户错过了一个字段,它应该重定向回表单。相反,它将它们重定向到 /。如果我在浏览器中单击返回,它会将我带回到表单,并且会突出显示缺少的正确字段。

如果我在我的本地机器上测试它,它会按预期工作。如果我将自己固定到 prod 中的其中一台服务器,它也可以正常工作,即使我手动在两台服务器之间切换。

我在旅途中意识到我需要在 _ss_environment.php 文件中定义负载均衡器:

define('SS_TRUSTED_PROXY_IPS', 'x.x.x.x/16');
define('SS_TRUSTED_PROXY_IP_HEADER', 'X-Forwarded-For');
define('SS_TRUSTED_PROXY_PROTOCOL_HEADER', 'X-Forwarded-Proto');

我也找不到 TRUSTED_PROXY 在框架中定义的位置,所以我添加了

define('TRUSTED_PROXY', '1');

还有。

但是,当验证失败时,表单仍会重定向到 /

这是怎么回事?是否还有其他我缺少的东西来定义 LB?

编辑

我已经删除了 CloudFront(LB 仍然存在),它现在可以按预期工作。我宁愿把它放回去,但我不确定是什么导致了这个问题。据我所知,唯一需要转发的是PHPSESSID cookie,是否还有其他东西?

对于 CloudFront,您必须将几个 header 列入白名单。对于这个问题,我认为是 Referer header.