X-Frame-Options Allow-From在Mozilla/IE的Salesforce Lightning模式下失效求助
这个问题我之前帮客户排查过,核心原因是X-Frame-Options: ALLOW-FROM的兼容性缺陷——这个指令已经被W3C标准废弃,Firefox和IE对它的支持非常有限(IE仅支持单个源,且实现逻辑有偏差;Firefox直接放弃了对它的支持),而Chrome只是做了兼容处理才让它暂时生效。
从你给出的错误提示也能明确看出问题:
Load denied by X-Frame-Options: https://smt12.na112.visual.force.com/ does not permit framing by https://na112.lightning.force.com/one/one.app?source=alohaHeader
Firefox/IE根本没识别到你设置的ALLOW-FROM规则,所以直接拦截了嵌入请求。
最优解决方案:改用Content-Security-Policy的frame-ancestors指令
frame-ancestors是目前标准推荐的替代方案,支持同时指定多个允许嵌入的源,且被所有主流浏览器(包括Firefox、Chrome、Edge,甚至新版IE11)支持。
你需要修改Apache配置,移除原来重复的X-Frame-Options设置,替换为以下内容:
Header always set Content-Security-Policy "frame-ancestors https://na112.lightning.force.com/ https://smt12.na112.visual.force.com/"
关键注意点:
- 务必删除原来的两条
Header always set X-Frame-Options配置,避免浏览器因规则冲突出现异常 frame-ancestors支持多个源,用空格分隔即可,无需重复设置指令
兼容老版本IE的备选方案(仅当必须支持IE10及以下时使用)
如果你的业务必须兼容IE10及更早版本(这些浏览器不支持frame-ancestors),可以保留X-Frame-Options,但注意IE的ALLOW-FROM只能设置单个源。如果需要支持多个源,你需要通过Apache的条件判断,根据请求的Referer动态设置对应的ALLOW-FROM规则,示例配置如下:
# 针对Lightning域名的请求设置ALLOW-FROM SetEnvIf Referer "^https://na112.lightning.force.com/" lightning_referer Header always set X-Frame-Options "ALLOW-FROM https://na112.lightning.force.com/" env=lightning_referer # 针对Visualforce域名的请求设置ALLOW-FROM SetEnvIf Referer "^https://smt12.na112.visual.force.com/" vf_referer Header always set X-Frame-Options "ALLOW-FROM https://smt12.na112.visual.force.com/" env=vf_referer
不过这种动态配置的维护成本较高,除非有硬性兼容要求,否则优先推荐使用Content-Security-Policy方案。
内容的提问来源于stack exchange,提问作者sonal pate

