我试图用post请求发送文件到我的服务器,但当它发送时,它会导致错误:

Access-Control-Allow-Headers不允许请求报头字段Content-Type。

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

$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-Headers不允许请求报头字段Access-Control-Allow-Origin

所以我谷歌了一下,我能找到的唯一类似的问题是提供了一半的答案,然后关闭为跑题。我应该添加/删除什么头?


当前回答

对我来说,我在web.config中有通配符“*”Access-Control-Allow-Headers:

<add name="Access-Control-Allow-Headers" value="*" />

这个解决方案适用于大多数导航器,但不适用于Safari或IE

结果证明,解决方案是手动添加所有自定义头到web.config:

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Access-Control-Allow-Origin" value="https://somedomain.com" />
            <add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS,PUT,DELETE" />
            <add name="Access-Control-Allow-Headers" value="custom-header1, custome-header2, custome-header3" />
        </customHeaders>
    </httpProtocol>
<system.webServer>

其他回答

在我的例子中,我将几个参数作为@HeaderParam接收到一个web服务方法中。

这些参数必须在你的CORS过滤器中声明:

@Provider
public class CORSFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {

        MultivaluedMap<String, Object> headers = responseContext.getHeaders();

        headers.add("Access-Control-Allow-Origin", "*");
        ...
        headers.add("Access-Control-Allow-Headers", 
        /*
         * name of the @HeaderParam("name") must be declared here (raw String):
         */
        "name", ...);
        headers.add("Access-Control-Allow-Credentials", "true");
        headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");   
    }
}

你可以在PHP中激活适当的头文件:

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, X-Requested-With");

如果你测试一些针对ionic2或angularjs 2的javascript请求,在你的chrome上的pc或mac上,然后确保你为chrome浏览器安装了CORS插件,以允许跨源。

也许不需要cors, get请求就可以工作,但是post、put和delete需要你安装cors插件进行测试,这肯定不酷,但我不知道没有cors插件人们是如何做到的。

还要确保json响应不会返回400

这是后台问题。如果在后端使用sails API更改cors.js并在这里添加您的文件

module.exports.cors = {
  allRoutes: true,
  origin: '*',
  credentials: true,
  methods: 'GET, POST, PUT, DELETE, OPTIONS, HEAD',
  headers: 'Origin, X-Requested-With, Content-Type, Accept, Engaged-Auth-Token'
};

您试图设置的头是响应头。它们必须在响应中由您发出请求的服务器提供。

在客户端上没有设置它们的位置。如果可以由需要权限的站点而不是拥有数据的站点授予权限,那么使用一种授予权限的方法就毫无意义了。