重定向后 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 重定向到。
我有一个通过 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 重定向到。