请求标头字段 访问控制-允许-标头不允许访问控制-允许-标头

2022-08-30 00:25:25

我正在尝试使用post请求将文件发送到我的服务器,但是当它发送时会导致错误:

请求标头字段“访问控制-允许-标头”不允许“内容类型”。

所以我用谷歌搜索了这个错误并添加了标题:

$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"
}

然后我得到错误:

请求标头字段访问控制-允许-源不允许访问控制-允许-标头

所以我用谷歌搜索了一下,我能找到的唯一一个类似的问题是提供了一个半答案,然后关闭了主题。我应该添加/删除哪些标头?


答案 1

我遇到了同样的问题。在 jQuery 文档中我发现:

对于跨域请求,请将内容类型设置为 、 以外的任何内容,或者将触发浏览器向服务器发送预检 OPTIONS 请求。application/x-www-form-urlencodedmultipart/form-datatext/plain

因此,尽管服务器允许跨域请求,但不允许,但它会抛出错误。默认情况下,角度内容类型为 ,它尝试发送 OPTION 请求。尝试覆盖有角度的默认标头或允许服务器端。下面是一个角度示例:Access-Control-Allow-Headersapplication/jsonAccess-Control-Allow-Headers

$http.post(url, data, {
    headers : {
        'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
    }
});

答案 2

服务器(POST请求发送到的服务器)需要在其响应中包含标头(etc)。将它们放在客户端的请求中没有任何效果。您应该删除“访问控制允许-...来自 POST 请求的标头。Access-Control-Allow-Headers

这是因为由服务器来指定它接受跨源请求(并且它允许请求标头等) - 客户端无法自行决定给定服务器是否应允许 CORS。Content-Type

请求者(Web浏览器)可以通过发送“OPTIONS”请求(即不是您打算的“POST”或“GET”请求)来“预检”测试服务器的同源策略。如果对“选项”请求的响应包含“访问控制-允许-...”标头允许您的请求正在使用的标头、源或方法,则请求者/浏览器将发送您的“POST”或“GET”请求。

(晦涩的注释:)访问控制允许-...具有值'',而不是列出允许的特定来源,标头或方法。但是,我使用的旧Android WebView客户端不支持“”通配符,并且需要在响应OPTIONS请求时在访问控制 - 允许 - 标头中列出的特定标头。