我正在尝试为多个子域启用 CORS,如下所建议: https://serverfault.com/a/1022028/593976
除 OPTIONS 请求外,其他一切正常。无论我做什么,当请求方法是 OPTIONS 时,Access-Control-Allow-Origin 都会设置为 *。
不确定这是否重要,但我在 Kubernetes 上使用 ingress-nginx。
在我看来,Nginx 有一些内部代码,这些代码在我应用所有配置后运行,如果请求方法是 OPTIONS,它会将 Access-Control-Allow-Origin 更改为 *。
如果有人知道发生了什么事,或者对如何解决这个问题有任何建议,请告诉我。
谢谢你!
答案1
为那些将来可能需要这个问题的人回答我自己的问题......
对我们有用的是删除以下注释:
nginx.ingress.kubernetes.io/cors-allow-credentials
nginx.ingress.kubernetes.io/cors-allow-methods
nginx.ingress.kubernetes.io/cors-allow-origin
nginx.ingress.kubernetes.io/enable-cors
并在代码片段中使用此代码动态设置标题:
nginx.ingress.kubernetes.io/configuration-snippet: |-
if ($request_uri ~ ^/(.*)/swagger-ui.html) {
return 403;
}
add_header Content-Security-Policy "frame-ancestors *";
if ($http_origin ~* (https?://.*\.dev\.totvs\.io(:[0-9]+)?$)) {
set $allow_origin $http_origin;
}
if ($http_origin ~* (https?://.*\.dev\.totvs\.app(:[0-9]+)?$)) {
set $allow_origin $http_origin;
}
more_set_headers 'Access-Control-Allow-Origin: $allow_origin';
more_set_headers 'Access-Control-Allow-Credentials: true';
more_set_headers 'Access-Control-Allow-Methods: PUT, GET, PATCH, DELETE, POST, OPTIONS';
more_set_headers 'Access-Control-Allow-Headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
# Cors Preflight methods needs additional options and different Return Code - UPDATED
if ($request_method = 'OPTIONS') {
more_set_headers 'Access-Control-Max-Age: 1728000';
more_set_headers 'Content-Type: text/plain charset=UTF-8';
more_set_headers 'Content-Length: 0';
return 204;
}