Nginx CORS 不适用于 POST

Posted

技术标签:

【中文标题】Nginx CORS 不适用于 POST【英文标题】:Nginx CORS doesn't work for POST 【发布时间】:2016-06-27 00:57:18 【问题描述】:

我的 nginx 中有这个配置

server 
    listen       8080;

add_header    Access-Control-Allow-Origin *;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Content-Type';

现在我有我的 web 应用程序,它为 GET 执行 GETPOST 它工作正常,但如果我执行 Ajax POST 我会收到此错误

XMLHttpRequest 无法加载 'URL' 。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'Origin' 不允许访问。响应的 HTTP 状态代码为 404。

如果我发出“GET”请求,我可以在回复中看到这一点。

Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Methods:GET, POST, OPTIONS
Access-Control-Allow-Origin:*

但是,如果我发帖,我什么都看不到。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,并通过将关键字 always 添加到我的 add_header 指令来解决它。如documentation所述:

add_header:如果响应代码等于 200、201、204、206、301、302、303、304 或 307,则将指定字段添加到响应标头。 [...]

如果指定了always 参数(1.7.5),则无论响应代码如何,都会添加标头字段。

发生的情况是,没有always,我的GET 请求返回200 并因此具有预期的标头,而我的POST 得到400,因此没有标头并因此触发CORS 错误.

【讨论】:

为我工作,我怀疑我的问题是关于请求返回 4xx 代码(此处的预期行为)被解释为 CORS 错误,但找不到更多信息。 什么对我有用:add_header 'Access-Control-Allow-Origin' * always;

以上是关于Nginx CORS 不适用于 POST的主要内容,如果未能解决你的问题,请参考以下文章

使用 Nginx 的 socket.io 出现 CORS 错误

为啥 CORS 似乎不适用于 POST?

CORS 不适用于 jQuery

Web Api 2 CORS 不适用于 POST

CORS 不适用于路由

CORS 不适用于 hapijs 和 socket.io