我理解为什么以下代码段在Firefox和Chrome中无效:我们正在向另一个域发出AJAX请求。
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://www.perdu.com", true);
xhr.addEventListener("load", function() { console.debug(xhr.responseText); }, false);
xhr.send(null);
但是为什么Safari会输出这个?这是页面的实际内容。我有Safari 7.1。
<html><head><title>Vous Etes Perdu ?</title></head><body><h1>Perdu sur l'Internet ?</h1><h2>Pas de panique, on va vous aider</h2><strong><pre> * <----- vous êtes ici</pre></strong></body></html>
答案 0 :(得分:3)
事实证明,从服务器或文件系统加载时,Safari的行为会有所不同。
下面的原始答案使用file:///
方案测试CORS功能。 Safari允许用户绕过该方案的CORS。
正如Jonathan Crowe在localhost
上指出的那样,使用http://
方案,Safari会阻止响应,就像Firefox和Chrome一样。
所以这个没有错误。至于文件系统上的行为,我想我们可以称之为功能或方便(考虑快速本地测试)?
注意:此更新依赖于一个额外的简单测试来从HTTP服务器提供下面的HTML代码段。没什么特别的,Safari就像其他人一样。
我可以重现这个问题。它可能是Safari 7.1中的一个错误,这是我在临时结论中找到的。
Origin
标头的浏览器。其他人将其设置为null
。此外,此版本的Safari允许在Origin
对象上设置XMLHttpRequest
标题(Chrome不会):
xhr.setRequestHeader("Origin", null);
将标题设置为null
以更接近其他浏览器不会改变结果:Safari 7.1仍允许响应通过请求者。
我无法确定这是Safari 7.1中的错误,但它现在似乎是它的行为。
以下一些细节。
<html>
<script>
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://www.perdu.com", true);
xhr.addEventListener("load", function() { console.debug(xhr.responseText); }, false);
xhr.send(null);
</script>
</html>
(全部在Mac OS X 10.9.5上)
GET / HTTP/1.1
Host: www.perdu.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:33.0) Gecko/20100101 Firefox/33.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: null
Connection: keep-alive
GET / HTTP/1.1
Host: www.perdu.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36
Origin: null
Accept: */*
DNT: 1
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,fr;q=0.6,ja;q=0.4,pt;q=0.2
GET / HTTP/1.1
Host: www.perdu.com
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.1.17 (KHTML, like Gecko) Version/7.1 Safari/537.85.10
Accept-Language: en-us
DNT: 1
Connection: keep-alive
我目前正在针对Web API在一系列浏览器上使用CORS测试边缘案例。如果一个错误得到确认,那不应该是一个太大的问题 - 只要API安全性足够严重(因为CORS不保护服务器)!
我问过Apple是否可以在feedback网站上确认。
答案 1 :(得分:1)
您可能拥有“禁用本地文件限制”&#39;在“开发”菜单中启用了选项。这将允许CORS请求通过。