允许 Nginx 上的跨源请求 (CORS) 产生 404 响应

允许 Nginx 上的跨源请求 (CORS) 产生 404 响应

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

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

答案1

尽管这个问题很久以前就被问到了,但我还是使用更多的模块编译了 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;
            }

答案2

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

more_set_headers 'Access-Control-Allow-Origin: *';

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

more_set_headers -s '404' 'Access-Control-Allow-Origin: *';

相关内容