【发布时间】:2017-12-25 21:12:26
【问题描述】:
从 Drupal 8.2 开始,cors 设置在核心中。在我的services.yml(和default.services.yml)中,我有以下设置:
cors.config:
enabled: true
# Specify allowed headers, like 'x-allowed-header'.
allowedHeaders: ['x-csrf-token','authorization','content-type','accept','origin','x-requested-with']
# Specify allowed request methods, specify ['*'] to allow all possible ones.
allowedMethods: ['*']
# Configure requests allowed from specific origins.
allowedOrigins: ['*']
# Sets the Access-Control-Expose-Headers header.
exposedHeaders: false
# Sets the Access-Control-Max-Age header.
maxAge: 1000
# Sets the Access-Control-Allow-Credentials header.
supportsCredentials: true
我的域 a.com 受 htaccess 密码保护。
在域 b.com 上,我尝试从域 a.com 加载一些 API:
$.ajaxSetup({
xhrField: {
withCredentials : true
},
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', 'Basic Z2VuaXVzOmNvYXRpbmdz');
}
});
request = $.ajax({
url: apiBaseUrl + 'api/foobar',
dataType: 'json',
type: 'get',
password: 'foo',
username: 'bar'
});
在 chrome 中它工作正常,在 Firefox 中我得到一个错误。请求头:
Access-Control-Request-Method: GET
Access-Control-Request-Headers: authorization
响应是 401“需要授权”,它说请求方法是 OPTIONS (?)。
这里有什么问题?
在insomnia 中执行相同的请求效果很好。
【问题讨论】:
-
你确定你在 Firefox 中看到的问题不仅仅是因为它正在加载它在服务器端添加 CORS 配置之前缓存的文档的缓存副本吗?您是否尝试过清除 Firefox 中的浏览器缓存?
-
并且要清楚为什么您会看到请求方法为 OPTIONS 的指示:这是因为请求中存在 Authorization 请求标头会触发您的浏览器自动进行 CORS 预检 OPTIONS在尝试您的代码尝试发送的 GET 请求之前请求 developer.mozilla.org/en-US/docs/Web/HTTP/…。
-
请求在 insomnia 中起作用的原因是因为没有对 insomnia 发出跨域请求的能力施加任何限制,而相比之下,浏览器会阻止您的前端 JavaScript 代码能够访问来自跨域的响应。源请求,除非这些响应包括 Access-Control-Allow-Origin 响应标头和任何其他必要的 CORS 响应标头。 developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS有详情
-
-
在Firefox中,我的5个ajax json请求之一在特定的
$.ajax()调用(或对象)中不起作用,除了ajaxSetup中的withCredentials,username和@987654336 @ 值对存在。 chrome 和 safari 显然忽略了这些,而 firefox 则不会。
标签: jquery ajax drupal cors drupal-8