根据我读过的关于IE9/IE8中CORS支持的所有文档,似乎很清楚:
- 您不能在这些浏览器中使用
XMLHttpRequest
发起CORS请求。你必须使用IE专有的XDomainRequest
。 -
XDomainRequest
不支持预飞行。我对这个限制的理解是,您只能发送POST或GET CORS请求,这些请求可能只包含简单的头。此外,微软还对XDR请求施加了其他非常奇怪的限制,但这在这里并不完全重要。
所以,我在http://192.168.1.1:8080
有一个页面。使用XMLHttpRequest
,我试图向http://192.168.1.1.9000
发送DELETE请求。我完全预料到会失败。我只是在重新考虑相关请求之前做了一个完整性检查,以确保一旦切换到使用XDR,它将适用于CORS请求。同样,我在这里使用IE8。
var xhr = new XMLHttpRequest();
xhr.open("DELETE", "http://192.168.1.1:9000", true);
xhr.send();
奇怪的是,请求似乎成功了。在端口9000的服务器上命中了DELETE操作处理程序。我返回了一个响应,并且我能够访问XHR对象实例上的responseText
。我无法想象为什么这真的有效。看起来不应该是这样,除非我在这里遗漏了什么。有人有什么想法吗?
经过一些调查和测试,我意识到IE并没有很好地遵循"同源"的定义。在RFC 6454第5节中编纂。特别是,IE认为具有不同端口的两个地址是相同的来源,只要它们也使用相同的协议和主机。RFC特别指出,还应该考虑端口。
微软没有在包括IE10在内的所有版本的IE中正确遵守此RFC。惊喜,惊喜。因此,在IE10和更早的版本中,我观察到的行为是意料之中的。在所有其他浏览器中,它都不是。