【发布时间】: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 上),所以这很奇怪。你也不使用任何代理?
标签: javascript macos xmlhttprequest cors