允许 Nginx 上的跨源请求 (CORS) 进行 404 响应

aln*_*h29 32 nginx cross-domain

我正在使用 Nginx 提供静态文件,以使用此问题中概述的技术响应 CORS 请求。但是,当文件不存在时,404 响应不包含Access-Control-Allow-Origin: *标头,因此会被浏览器阻止。

如何发送Access-Control-Allow-Origin: *404 响应?

小智 43

尽管很久以前就有人问过这个问题,但我正在用更多的模块编译 nginx,但是使用较新版本的 nginx,我发现我不必自定义编译 nginx,我只需要添加always指令即可。

http://nginx.org/en/docs/http/ngx_http_headers_module.html

Syntax: add_header name value [always];

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

因此,CORS标头的调整版本:

            if ($cors = "trueget") {
                    # Tells the browser this origin may make cross-origin requests
                    # (Here, we echo the requesting origin, which matched the whitelist.)
                    add_header 'Access-Control-Allow-Origin' "$http_origin" always;

                    # Tells the browser it may show the response, when XmlHttpRequest.withCredentials=true.
                    add_header 'Access-Control-Allow-Credentials' 'true' always;
            }
Run Code Online (Sandbox Code Playgroud)

  • `总是`是关键。谢谢你指出这一点,我快疯了! (2认同)

mgo*_*ven 13

我假设您当前正在使用add_header指令。文档指出,这只设置了 200、204、301、302 和 304 状态代码的标头。要为 404 状态代码设置标头,您需要使用headers_more模块中的more_set_headers指令(您可能需要重新编译 nginx 以获取此模块)。以下将设置所有状态代码的标头:

more_set_headers 'Access-Control-Allow-Origin: *';
Run Code Online (Sandbox Code Playgroud)

您还可以将其限制为特定的状态代码:

more_set_headers -s '404' 'Access-Control-Allow-Origin: *';
Run Code Online (Sandbox Code Playgroud)