NGINX add_header,添加多个header

Gaj*_*jus 28 nginx

我正在尝试发送多个标头

add_header Access-Control-Allow-Origin http://dev.anuary.com;
add_header Access-Control-Allow-Origin https://dev.anuary.com;
Run Code Online (Sandbox Code Playgroud)

然而,NGINX 将它们变成了

Access-Control-Allow-Origin: http://dev.anuary.com, https://dev.anuary.com
Run Code Online (Sandbox Code Playgroud)

解决办法是什么?

Sha*_*den 34

嗯,是的,nginx 正在组合同名的标头......但它是根据 HTTP 规范这样做的。 见第 4.2 节

标题:

Access-Control-Allow-Origin: http://dev.anuary.com, https://dev.anuary.com
Run Code Online (Sandbox Code Playgroud)

根据 HTTP/1.1 规范,在功能上等同于:

Access-Control-Allow-Origin: http://dev.anuary.com
Access-Control-Allow-Origin: https://dev.anuary.com
Run Code Online (Sandbox Code Playgroud)

如果您的系统或应用程序能够读取一种格式而不能读取另一种格式,那么这就是问题所在。nginx 做得对。


编辑

Mozilla的文件规定,只能有一个Access-Control-Allow-Origin头。

它的格式(见这里)应该是一个以空格分隔的起源列表:

add_header Access-Control-Allow-Origin "http://dev.anuary.com https://dev.anuary.com";
Run Code Online (Sandbox Code Playgroud)

但实际上,您应该Origin显客户端提供的标头,而不是突然生成一个标头。这可能更合适:

if ($http_origin ~* "^https?://dev\.anuary\.com$" ) {
    add_header Access-Control-Allow-Origin $http_origin;
}
Run Code Online (Sandbox Code Playgroud)