重定向后 IE11 忽略 X-Frame-Options

IE11 ignores X-Frame-Options after redirect

我有一个通过 Facebook Messenger 应用程序打开的 Web 应用程序。在移动设备上,它在 Facebook Messenger 的网络视图中打开,在桌面设备上,它在 iFrame 中打开。这适用于除 IE11 以外的所有浏览器。

我们正在设置 X-Frame-Options header 'ALLOW-FROM https://www.messenger.com'。当应用程序首次加载到 iFrame 中时,它加载时没有任何问题。然后应用程序使用 302 响应请求并重定向。重定向到的页面显示错误 "This content cannot be displayed in a Frame"。控制台中没有错误,就像其他浏览器中阻止 iFrame 内容时通常出现的错误一样。

iFrame 中是否有某些 IE11 不支持的重定向方面?

申请详情: 这是一个在客户端使用 JS 的 Django server-side 呈现的网络应用程序。我将尝试分解操作顺序:

请求 1:GET 到端点 1,其中 returns 文档 - 这已成功显示在 iFrame 中

请求 2:POST 从客户端上的 JS 到端点 1

const formData = new FormData();

        formData.append('psid', thread_context.psid);
        formData.append('tid', thread_context.tid);

        const xhr = new XMLHttpRequest();

        xhr.onload = function (event) {
            if (this.status !== 200) {
                handleError(this);
                return;
            }

            window.location.href = this.responseURL;
        };
        xhr.onerror = handleError;

        xhr.open('POST', postUrl);
        xhr.send(formData);

响应是状态代码 302,位置为 header

请求 3:GET 到 302 响应中返回的位置。 响应是状态代码 200,并在 body 中包含文档。 这会导致上面的 xhr.onload 触发,然后调用 window.location.href 重定向到之前返回的新位置。

请求 4:GET 作为更新 window.location.href 的结果。响应是状态代码 200。这是浏览器显示 "content cannot be displayed in a Frame" 消息的时间。

这些请求中的每一个都在响应中包含 'ALLOW-FROM https://www.messenger.com' 的 X-Frame-Options header。

原来 "content cannot be displayed in Frame" 消息是一个转移注意力的信息。问题确实是由于设置:

window.location.href = this.responseURL;

在 IE 中,可能还有旧版本的 Edge responseURL is not a supported property of XMLHttpRequest。此外,在 IE 中出现 302 后似乎无法获得请求 URL。因此,我的解决方案是重写我们对 returning 302 的用法,而不是 return 一个 JSON 响应,其中 URL 重定向到。