请求头字段Access-Control-Allow-Headers被Access-Control-Allow-Headers禁止。
请求头字段Access-Control-Allow-Headers被Access-Control-Allow-Headers禁止。
我正在尝试通过POST请求将文件发送到我的服务器,但当发送请求时会导致以下错误:
请求头字段Content-Type未被Access-Control-Allow-Headers允许。
所以我谷歌了这个错误,并添加了头部:
$http.post($rootScope.URL, {params: arguments}, {headers: { "Access-Control-Allow-Origin" : "*", "Access-Control-Allow-Methods" : "GET,POST,PUT,DELETE,OPTIONS", "Access-Control-Allow-Headers": "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With" }
然后我得到了以下错误:
请求头字段Access-Control-Allow-Origin未被Access-Control-Allow-Headers允许
所以我谷歌了一下,发现唯一相似的问题被提供了一些回答,然后被关闭了。我该添加/删除哪些头部呢?
服务器(接收POST请求的)需要在响应中包含Access-Control-Allow-Headers
头部等。在客户端请求中添加这些头部没有效果。因此你应该从POST请求的头中删除"Access-Control-Allow-..."。
这是因为决定是否接受跨源请求(以及允许哪些请求头等)的是服务器,而不是客户端自己决定哪些服务器应该允许CORS。
请求者(web浏览器)可以通过发送“OPTIONS”请求(而不是您预期的“POST”或“GET”请求)来“预检”服务器的同源策略。如果对“OPTIONS”请求的响应包含允许使用您请求的头部、源或方法的“Access-Control-Allow- ...”头部,则请求者/浏览器将发送您的“POST”或“GET”请求。
(不常见的注意点:)Access-Control-Allow-...的值是"",而不是列出特定的源、头、或方法。但是,我用过的一个旧的Android WebView客户端没有尊重""通配符,需要在响应的Access-Control-Allow-Headers头部中列出特定的头。
我也遇到了同样的问题。在jQuery文档中,我找到:
对于跨域请求,将内容类型设置为除
application/x-www-form-urlencoded
、multipart/form-data
或text/plain
之外的任何内容,都会触发浏览器向服务器发送一个预检 OPTIONS 请求。
因此,虽然服务器允许跨域请求,但不允许 Access-Control-Allow-Headers
,它将抛出错误。默认情况下,Angular的内容类型是 application/json
,它会尝试发送一个 OPTIONS 请求。尝试覆盖Angular的默认头文件或在服务器端允许 Access-Control-Allow-Headers
。这是一个Angular示例:
$http.post(url, data, { headers : { 'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8' } });