我正在使用凭据和预检请求实现CORS,我有点困惑为什么预检请求在Firefox 30中始终失败,但在Safari(7.0.2)和Chrome35中有效。我认为这个问题不同于“为什么经过身份验证的CORS请求的预检OPTIONS请求在Chrome而不是Firefox中有效?”因为我没有收到401,而是来自浏览器客户端的特定CORS消息:
“跨源请求已阻止:同源策略不允许读取 http://myurl.dev.com 的远程资源。可以通过将资源移动到同一域或启用 CORS 来解决此问题。
在不显示源代码的情况下,我正在做的是:
在服务器上:
OPTIONS响应的标头:
发布响应的标题:
在浏览器客户端中:
jQuery.ajax({
url: requestUrl,
type: 'POST',
data: getData(),
xhrFields: {
withCredentials: true
}
});
根据规范,这将触发 OPTIONS 预检请求,该请求需要在其响应中包含 CORS 标头。我已经通读了 W3C 规范好几遍,我无法确定我在印前检查响应中做错了什么(如果有的话)。
我注意到,当您发送设置了cookie的CORS(跨源资源共享)请求时,Firefox不会发送所需的响应头。
解决方案:
下面的解决方案仅为 OPTIONS 请求添加标头,并且仅接受来自 example.com 的请求。您可以更改其他请求方法和预期主机的实现。
JS代码
var xmlhttp = new XMLHttpRequest();
xmlhttp.withCredentials = true;
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == XMLHttpRequest.DONE) {
if (xmlhttp.status == 200) {
success_callback(xmlhttp.responseText);
} else {
error_callback(xmlhttp.statusText);
}
}
};
xmlhttp.open("DELETE", url);
xmlhttp.send(null);
当您发送删除请求时,浏览器会发送一个飞行前选项请求,这要求在响应标头中包含访问控制允许方法。基于此标头值,发送实际的删除请求。在Firefox中,当您发送删除请求时,飞行前请求的响应标头没有预期的标头,因此无法发送实际的删除请求。
要克服此问题,请使用以下NGINX服务器配置。
NGINX代码
#handle CORS requests by adding required headers
if ($http_origin ~* .example.com) {
set $cors "CORS-${request_method}";
}
if ($cors = "CORS-OPTIONS") {
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Content-Type';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE';
add_header 'Access-Control-Allow-Origin' $http_origin;
}
好读CORS:https://www.html5rocks.com/en/tutorials/cors/
请注意,Firefox是这里唯一兼容的浏览器。如果Access-Control-Allow-Method
的解析每https://fetch.spec.whatwg.org/#cors-preflight-fetch失败,则需要返回网络错误。并且根据标头值的ABNF,它绝对是逗号分隔的值。
问题:为什么此 CORS 请求仅在 Firefox 中失败?
答:虽然与OP的具体情况无关,但它可能会帮助您了解Firefox默认情况下不信任Windows证书存储中的CA(证书颁发机构),这可能会导致Firefox中的CORS请求失败(正如Svish在问题注释中提到的)。
要允许Firefox信任Windows证书存储中的CA:
about: config
security.enterprise_roots.enabled
作为名称将值设置为true
答案来源:https://support.umbrella.com/hc/en-us/articles/115000669728-Configuring-Firefox-to-use-the-Windows-Certificate-Store
[注意:以下所有oauth代币/秘密都是随机创建的;它们不是我的实际代币/秘密] [为了清晰起见,我添加了换行符;实际命令只有一行] 假设所有其他数据都是有效的,为什么上面的命令会产生“无法验证oauth签名和令牌”(即使在使用真实数据时)? 特别是,我的签名“H0KLLecZNAAz+XyrPRiUs37X3Zz+AcabMa5M4oDLkM”是无效的,还是我做了一些更根本的错误。 我用来生成这
问题内容: 在我的应用中,我正在创建从HTTP到HTTPS的AJAX请求。这意味着我需要CORS。因此,我向jQuery.ajax添加了一些标题和参数并对其进行了测试。在Firefox中,一切正常,但在Chrome中,一切正常。Chrome会“杀死”每一个预先提出的请求(选项)。 jQuery脚本: HTTP转储: 有人知道为什么Chrome会终止此请求吗? 问题答案: 也许您的https服务器具
我的代码基于SpringBoot,接收post请求,解析json数据并使用jdbc执行。 } curl命令如下所示: 但是,当我通过curl发送post请求时,无法解析参数并且始终为空。 为什么会发生这个问题,如何解决? 堆栈跟踪:
问题内容: 我正在编写一个JavaScript客户端,该客户端将包含在第3方网站上(想像Facebook Like按钮)。它需要从需要基本HTTP身份验证的API检索信息。简化的设置如下所示: 第三方网站的网页上包含以下代码段: widget.js 调用API: 已将API配置为使用适当的标头进行响应: 请注意,将设置为,而不是使用通配符,因为我正在发送凭据请求()。 现在一切就绪,可以进行异步的
问题内容: 我们有一个node.js服务器,该服务器将REST API实施为中央服务器的代理,而中央服务器具有一个略有不同且不对称的REST API。 我们的客户端运行在各种浏览器中,它要求节点服务器从中央服务器获取任务。节点服务器从中央服务器获取所有任务ID的列表,并将其返回给客户端。然后,客户端通过代理对每个ID进行两次REST API调用。 据我所知,这些工作都是异步完成的。在控制台日志中,
我正在使用PARSE API发出GET请求。我收到一个“414请求URI太大”错误,但我不明白为什么。这是我请求的代码: