在nginx上启用CORS

在nginx上启用CORS,nginx,cors,swagger-ui,Nginx,Cors,Swagger Ui,我已经按照这个例子在我的API子域上启用了CORS,这样我就可以从SwaggerUI向它发送请求。这是我在该子域上运行选项得到的输出: curl -i -X OPTIONS http://api.MYDOMAIN.com/v1/data/extraction HTTP/1.1 204 No Content Server: nginx/1.10.3 (Ubuntu) Date: Wed, 18 Apr 2018 20:45:52 GMT Connection: keep-alive Access

我已经按照这个例子在我的API子域上启用了CORS,这样我就可以从SwaggerUI向它发送请求。这是我在该子域上运行选项得到的输出:

curl -i -X OPTIONS http://api.MYDOMAIN.com/v1/data/extraction

HTTP/1.1 204 No Content
Server: nginx/1.10.3 (Ubuntu)
Date: Wed, 18 Apr 2018 20:45:52 GMT
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-API-Key
Access-Control-Max-Age: 1728000
Content-Type: text/plain charset=UTF-8
Content-Length: 0

我一直在想,为什么在我的文档子域(同一个DOMAIN.com服务器)的Chrome中,它仍然会给我这个答案。有人能告诉我应该去哪里找吗?

我也遇到了类似的问题,无法让它工作。这个设置终于对我起作用了。这就是它看起来的样子。我刚刚将
$cors'true'
设置为测试它是否有效。这对我有用。这都在/location{…}区域中

set $cors '';
    if ($http_origin ~ '^https?://(localhost|www\.yourdomain\.com|www\.yourotherdomain\.com)') {
            set $cors 'true';
    }

    if ($cors = 'true') {
            add_header 'Access-Control-Allow-Origin' "$http_origin" always;
            add_header 'Access-Control-Allow-Credentials' 'true' always;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
            add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;
            # required to be able to read Authorization header in frontend
            #add_header 'Access-Control-Expose-Headers' 'Authorization' always;
    }

    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' "$http_origin" always;
            add_header 'Access-Control-Allow-Credentials' 'true' always;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
            add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;
            # required to be able to read Authorization header in frontend
            #add_header 'Access-Control-Expose-Headers' 'Authorization' always;
            # Tell client that this pre-flight info is valid for 20 days
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain charset=UTF-8';
            add_header 'Content-Length' 0;
            return 204;
    }

我有一个类似的问题,无法让它工作。这个设置终于对我起作用了。这就是它看起来的样子。我刚刚将
$cors'true'
设置为测试它是否有效。这对我有用。这都在/location{…}区域中

set $cors '';
    if ($http_origin ~ '^https?://(localhost|www\.yourdomain\.com|www\.yourotherdomain\.com)') {
            set $cors 'true';
    }

    if ($cors = 'true') {
            add_header 'Access-Control-Allow-Origin' "$http_origin" always;
            add_header 'Access-Control-Allow-Credentials' 'true' always;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
            add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;
            # required to be able to read Authorization header in frontend
            #add_header 'Access-Control-Expose-Headers' 'Authorization' always;
    }

    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' "$http_origin" always;
            add_header 'Access-Control-Allow-Credentials' 'true' always;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
            add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;
            # required to be able to read Authorization header in frontend
            #add_header 'Access-Control-Expose-Headers' 'Authorization' always;
            # Tell client that this pre-flight info is valid for 20 days
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain charset=UTF-8';
            add_header 'Content-Length' 0;
            return 204;
    }

您可能希望使用curl和CORS-origin头测试对api.MYDOMAIN.com/v1/data/extraction的调用

curl -i -X POST -H "Origin: http://docs.whatever.com" \
 --verbose http://api.MYDOMAIN.com/v1/data/extraction
响应应与标题一起返回:

访问控制允许来源:*

若该标题并没有返回响应,chrome将抛出一个类似于您所看到的错误


另外,错误中提到nginx使用404进行响应,这可能与此有关。

您可能需要使用curl和CORS origin头测试对api.MYDOMAIN.com/v1/data/extraction的调用

curl -i -X POST -H "Origin: http://docs.whatever.com" \
 --verbose http://api.MYDOMAIN.com/v1/data/extraction
响应应与标题一起返回:

访问控制允许来源:*

若该标题并没有返回响应,chrome将抛出一个类似于您所看到的错误


另外,错误中提到nginx使用404进行响应,这可能与此有关。

问题很可能是
访问控制允许来源:
访问控制允许凭据:true
不兼容如果要传递凭据,您需要使用
accesscontrolalloworigin:{Origin请求头的值}进行响应
访问控制允许凭据:true

问题很可能是
访问控制允许来源:
访问控制允许凭据:true
不兼容如果要传递凭据,需要使用
访问控制允许来源:{value of Origin request header}
Access Control Allow Credentials:true

所有这一切都归结于NGINX使用了更多的设置头而不是添加头(可能是NGINX启用了这个模块)在这之后,使用上面的一个例子使它工作起来。

所有这一切都归结为一个事实,即NGINX使用了更多的设置标题,而不是添加标题(可能是NGINX启用了这个模块)在这之后,使用上面的一个例子使它工作起来。

我认为它不是add_头,而是more_set_头命令。现在的问题是X-API-KEY头不是由招摇过市者发送的……最后一个谜题是darrenleeweber在讨论中的建议,需要指定的部分在“安全”中部分。谢谢大家,问题关闭!考虑把你的发现作为答案而不是在评论部分。确实会这样做的,它已经凌晨2点了,需要先睡一会儿:我觉得不是AddiHead,而是MulySoSythHead命令。现在问题是XAPI密钥头不是由SavaGUI发送的……而最后一个是O。f谜题是darrenleeweber在讨论中提出的,需要在“安全性”中指定的部分部分。谢谢大家,问题关闭!考虑把你的发现作为答案而不是在评论部分。确实会这样做的,它已经凌晨2点了,需要先睡一会儿:现在它确实带着标题回来了,我给NGIX添加了错误的命令。现在它返回了头,我给N添加了错误的命令。正如您可能已经注意到的,我已经包含了访问控制允许凭据:true以及访问控制允许头:X-API-KEY,所以关于您的建议的唯一问题仍然是{Origin request header的值}如果没有任何域,如果我指定了Access Control Allow Origin:*?基本上,检索Origin请求头的值(这将是scheme://domain:port (请求资源的页面的名称)您可能已经注意到,我已经包含了访问控制允许凭据:true以及访问控制允许标头:X-API-KEY,因此关于您的建议的唯一问题仍然是{原始请求标头的值}如果没有任何域,如果我指定了Access Control Allow Origin:*?基本上,检索Origin请求头的值(这将是scheme://domain:port 请求资源的页面)和“镜像”返回ACAO响应标头。