IE8/IE9 中的跨域标头

Posted

技术标签:

【中文标题】IE8/IE9 中的跨域标头【英文标题】:cross-origin header in IE8/IE9 【发布时间】:2012-03-27 23:37:44 【问题描述】:

由于 jQuery ajax 不适用于 CORS/IE,我使用 XDomainRequest 从另一台服务器检索数据。工作正常,但我想发送一些标头('Authentification'、'content-type')。

是否有机会在 XDomainRequest 中添加/更改标头?

或者有人知道解决方法吗?

【问题讨论】:

【参考方案1】:

IE 的 XDomainRequest 不允许设置自定义标头。请参阅此处的第 3 项:http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx XDomainRequest 对象被锁定到难以发出经过身份验证的请求的程度。

【讨论】:

但是必须有解决方法!?!还是 IE 比我想象的更糟糕? 如果无法设置自定义标头或 cookie,我不确定发出经过身份验证的请求的好方法。您可以将身份验证凭据作为查询参数传递(我相信 OAuth2 用户代理流程允许这样做),但这可能不那么安全(应该通过 SSL 完成)。抱歉,也许其他人有更好的答案:-) 我以为您只需要他们登录到其他域站点。 (从而设置适当的会话 cookie 和身份验证标头)。那么您的 XDomainRequest 会使用他们建立的会话吗?不过我可能错了。 @JohannesStaehlin 是的,IE 比你想象的还要糟糕。不管你怎么想;比那更糟。【参考方案2】:

这就是我们为 IE 所做的。

如果您可以控制目标域,请在其中托管一个(静态)html 文件。使用 iframe 包含 html。

现在这个 iframe 确实可以访问本地域,因此您可以在父框架和子框架之间进行通信以获得所需的内容。

这对我们来说比 XDomainRequest 效果好多

window.postMessage 是设置通信的最佳方式:

但我很确定它是从 IE8 开始工作的。如果您还需要旧版浏览器,则必须使用不同的 hack。

在我们的例子中,这是我们的 3 层系统:

    CORS,适用于支持它的浏览器 iframe 和 window.postMessage 作为主要后备 作为辅助后备的服务器端代理脚本

所有这些选项都运行良好、可靠且不会让人觉得太像黑客。次要后备几乎从未使用过。

请记住,“身份验证”标头是特殊的,无论如何,在某些情况下它被阻止我不会感到震惊。我们添加了一个自定义标头“X-Authenticate”,因为它一直通过。

【讨论】:

前几天我查看了 iframe 解决方法。但由于您必须设置“document.domain”,它似乎只适用于同一 TLD 的两个子域之间的通信。但是两个不同的***域名呢? (我可能不得不在周末更深入地研究代理服务器的东西......) 如果 iframe 与 API 托管在同一域中,则 iframe 解决方案应该工作。如果代理脚本是您的解决方案,那么对于您的目的来说,这可能会很多更容易。请注意,它(通常)与其说是代理服务器,不如说它只是一个服务器端代理脚本。 好的,我让 iframe 的东西工作了。我将一个包含所有信息(标题、post-body、...)的对象传递给框架窗口,框架窗口执行请求并返回响应。 :) 关于代理脚本:如果我在 API-Server 上托管脚本,我仍然需要在 Ajax 中发送带有标头的请求。所以脚本将与“请求”页面位于同一台服务器上? (=^ 客户)?这种方式 IE 允许我发送标题、正文等。并且代理将请求发送到 api-server (curl)?!? 是的,如果是代理脚本,它必须与“调用页面”位于同一域中。

以上是关于IE8/IE9 中的跨域标头的主要内容,如果未能解决你的问题,请参考以下文章

带有 PHP 标头的跨域请求标头 (CORS)

带有 jquery.ajax() 的跨域“授权”标头

发送带有自定义 HTTP 标头的跨域请求时禁用预检 OPTION 请求

具有自定义标头和请求正文作为 JSON 字符串的跨域 jquery ajax 请求

带有自定义标头的跨域 jquery ajax api 调用未命中服务器

跨域 ajax 请求中的预检标头未解决授权标头