大家好,
我们在应用程序中的 iframe 中嵌入了一个 Discourse 实例,并且运行正常。但是,当未经身份验证的用户尝试访问他们无权访问的页面(不存在或受组限制)时,响应中现在神秘地包含了 X-Frame-Options: SAMEORIGIN,浏览器会阻止 iframe 渲染。
我从 3.3.1 stable 版本开始,一直测试到几乎最新的开发版本(上次测试在上周中旬)。
它运行在我们应用程序的另一个子域上,并配置为嵌入,设置了 allow_embedding_site_in_an_iframe: true。通过调试一个干净的实例,我注意到在这种情况下,ApplicationController 中的 conditionally_allow_site_embedding 方法没有被调用,因此响应中保留了该头信息(GH 链接),并且追踪到它在某个点抛出了一个异常,从而中断了流程。
重现步骤:
- 运行一个干净的 Discourse 实例(或任何实例),并将其配置为
allow_embedding_site_in_an_iframe: true。 - 将其嵌入到通过 HTTPS 服务的网站中的 iframe 中,使用一个不存在的路径来触发 404 错误。
预期:浏览器允许 Discourse 渲染。
实际:浏览器由于响应中存在的 X-Frame-Options: SAMEORIGIN 而阻止 Discourse 渲染。
附注:它通过一个仅限 DNS 的 Cloudflare 运行,我们尝试在代理模式下删除该头信息,但是我们无法将其置于代理模式,因为 CF 会过滤掉我们自定义 SSO 实现所需的 cookie,所以这目前对我们来说不是一个选项。