Mac 浏览器似乎吞下了最初的 CORS XHR 预检请求

Posted

技术标签:

【中文标题】Mac 浏览器似乎吞下了最初的 CORS XHR 预检请求【英文标题】:Mac browsers seem to swallow initial CORS XHR preflight request 【发布时间】:2013-12-24 07:06:21 【问题描述】:

我有一个非常简单的支持 CORS 的 Node.js Web 服务器,在我办公室的另一台机器上运行。我设置它在 8080 端口上运行。

如果我将它作为初始请求发送,触发预检(例如内容类型为 application/json 的请求),它将失败,但仅在非常特定的条件下:

    服务器在端口 80 或 8080 上运行。任何其他端口都可以正常工作。 我从 Mac (OS X 10.8.5) 发送请求。无论我是在本地机器上还是在单独的 Windows 机器上运行服务器,效果都是一样的。如果我在我的 Mac 上运行服务器并从我的 Windows 机器发出请求,它就可以正常工作。

这是我用来发送请求的代码:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://myserver.domain.com'); // NOT the real URL of course...
xhr.setRequestHeader('Content-Type', 'application/json'); // Triggers the preflight OPTIONS request.
xhr.send();

非常简单。没有花里胡哨,但出于某种原因,如果我在 Mac 上运行该请求,浏览器似乎在发送 OPTIONS 请求之前就将其吞下。我没有收到任何迹象表明它曾经被服务器接收过,并且浏览器控制台显示一个(相对无用的)错误。所有三种主要浏览器(Chrome、Safari 和 Firefox)都显示相同的行为。

其他使用类似 Mac 的同事也尝试过,结果相同,所以它似乎不是特别针对我的机器。

我认为这可能是我的服务器的问题,因为我在一个著名的支持 CORS 的 API 服务器(即 api.github.com)上尝试了相同的操作,并且效果很好。但是,我已经在本地针对 2 个完全不同的服务器应用程序运行它,结果相同。

CORS 响应标头看起来不错 - 正如我所说,如果我从 Windows 浏览器发送请求,它可以完美运行。此外,如果我最初发送的是非预检请求,后续预检请求也可以正常工作。

我认为在“localhost”或“127.0.0.1”上运行服务器或客户端可能存在问题,但我也使用它们的主机名运行两者,结果相同。

不涉及 SSL,一切都是基于 HTTP 的明文。

以前有没有人见过这种特定于 Mac 浏览器的行为?

【问题讨论】:

你在运行类似 LittleSnitch 的东西吗? 不,没什么,我已经关闭了防火墙进行测试。 我无法重现(也在 10.8.5 上),所以这很奇怪。你也不使用任何代理? 【参考方案1】:

找到我自己问题的答案。

适用于 Mac 的 Cisco AnyConnect 客户端似乎会导致 CORS 请求出现问题。

提示:Computer Blocking CORS OPTIONS Request 我卸载了它,现在一切正常。

我的问题的评论者对此表示赞同,但我没有怀疑 *** 软件会导致此类问题,你知道,它没有运行。

更新

显然在没有 Web Security 模块的情况下重新安装它会解决问题。

http://www.bennadel.com/blog/2559-Cisco-AnyConnect-***-Client-May-Block-CORS-AJAX-OPTIONS-Requests.htm

【讨论】:

另外,这篇博文是在我发布这个问题的前 1 天发布的,这让我很开心。 非常感谢。我一直在打猎,但没想到会是思科。谢谢 mWillis

以上是关于Mac 浏览器似乎吞下了最初的 CORS XHR 预检请求的主要内容,如果未能解决你的问题,请参考以下文章

xhr.withCredentials与 CORS 什么关系

xhr.withCredentials与 CORS 什么关系

CORS withCredentials - 支持有限?

CORS XHR 重定向不起作用

AJAX学习笔记2:XHR实现跨域资源共享(CORS)以及和JSONP的对比

CORS