Javascript CORS请求与Safari合作?

Javascript CORS请求与Safari合作?,javascript,ajax,safari,Javascript,Ajax,Safari,我理解为什么以下代码片段在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会输出这个呢

我理解为什么以下代码片段在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 &ecirc;tes ici</pre></strong></body></html>

VOU Etes Perdu?Perdu sur l'Internet?Pas de panique,在va VOU aider*您可能在“开发”菜单中启用了“禁用本地文件限制”选项。这将允许CORS请求通过。

您可能在“开发”菜单中启用了“禁用本地文件限制”选项。这将允许CORS请求通过。

更新 事实证明,从服务器或文件系统加载时,Safari的行为有所不同

下面的原始答案使用
文件://
方案测试CORS功能。Safari允许用户绕过该方案中的COR

正如Jonathan Crowe在
localhost
上指出的那样,使用
http://
方案,Safari会阻止响应,就像Firefox和Chrome一样

所以这一个没有bug。至于文件系统上的行为,我想我们可以称之为特性或便利(考虑快速本地测试)

注意:此更新依赖于一个附加的简单测试来从HTTP服务器提供下面的HTML代码段。没什么特别的,狩猎和其他人一样

原始答案 我可以重现这个问题。这可能是Safari 7.1中的一个bug,下面是我对这个临时结论的发现

  • 在Safari 7.0.1上不可复制(见Jonathan Crowe的评论)
  • 两个主要区别:
    • Safari是唯一一款不设置
      Origin
      标题的浏览器。其他人将其设置为
      null
    • WebKit版本在Safari和Chrome上有所不同
  • 苹果电脑上没有关于CORS的错误报告
此外,此版本的Safari允许在
XMLHttpRequest
对象上设置
Origin
标题(Chrome不允许):

将标题设置为
null
以接近其他浏览器不会改变结果:Safari 7.1仍然允许响应传递给请求者

我不能确定这是Safari 7.1中的一个bug,但它现在的行为似乎就是这样

下面是一些细节

测试页面和代码 Chrome请求转储 Safari请求转储
注 我目前正在使用CORS在一系列浏览器上测试一个web API的边缘案例。如果一个bug被确认,它应该不是一个太大的问题——只要API安全性足够严重(因为CORS不能保护服务器)

更新 我问过苹果,他们是否可以在他们的网站上确认。

更新 事实证明,从服务器或文件系统加载时,Safari的行为有所不同

下面的原始答案使用
文件://
方案测试CORS功能。Safari允许用户绕过该方案中的COR

正如Jonathan Crowe在
localhost
上指出的那样,使用
http://
方案,Safari会阻止响应,就像Firefox和Chrome一样

所以这一个没有bug。至于文件系统上的行为,我想我们可以称之为特性或便利(考虑快速本地测试)

注意:此更新依赖于一个附加的简单测试来从HTTP服务器提供下面的HTML代码段。没有什么花哨,而狩猎只是表现得像其他人

原始答案 我可以重现这个问题。这可能是Safari 7.1中的一个bug,下面是我对这个临时结论的发现

  • 在Safari 7.0.1上不可复制(见Jonathan Crowe的评论)
  • 两个主要区别:
    • Safari是唯一一款不设置
      Origin
      标题的浏览器。其他人将其设置为
      null
    • WebKit版本在Safari和Chrome上有所不同
  • 苹果电脑上没有关于CORS的错误报告
此外,此版本的Safari允许在
XMLHttpRequest
对象上设置
Origin
标题(Chrome不允许):

将标题设置为
null
以接近其他浏览器不会改变结果:Safari 7.1仍然允许响应传递给请求者

我不能确定这是Safari 7.1中的一个bug,但它现在的行为似乎就是这样

下面是一些细节

测试页面和代码 Chrome请求转储 Safari请求转储
注 我目前正在使用CORS在一系列浏览器上测试一个web API的边缘案例。如果一个bug被确认,它应该不是一个太大的问题——只要API安全性足够严重(因为CORS不能保护服务器)

更新
我问过苹果公司是否可以在他们的网站上确认。

我无法在safari 7.0.1上从localhost复制这种行为。您从哪个域执行请求?我也无法从localhost复制该请求,但如果我右键单击该文件以使用Safari打开它,它会加载页面内容。如果我在Chrome或Firefox上这么做,它不会。这仅仅是Safari的一个特点吗?您能否在Safari浏览器中共享网络面板的屏幕截图?您还可以查看浏览器中是否有任何控制台消息吗?还包括CORS浏览器兼容性参考,以帮助回答问题。除了查询结果之外,没有控制台消息。以下是请求的屏幕截图:XMLHttpRequest无法加载。访问控制不允许原始文件:/。允许原始文件。这是safari结果。在safari 7.0.1上,无法从localhost运行此行为。您从哪个域执行请求?我也无法从localhost复制该请求,但如果我右键单击该文件以使用Safari打开它,它会加载页面内容。如果我在Chrome或Firefox上这么做,它不会。这仅仅是Safari的一个特点吗?您能否在Safari浏览器中共享网络面板的屏幕截图?阿尔索
xhr.setRequestHeader("Origin", null);
<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>
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