如何配置Ingress Nginx使其仅为指定域名返回CORS跨域头
Nginx Ingress 仅指定域名开启CORS配置方案
配置失效原因
你之前的自定义规则不生效,核心是nginx.ingress.kubernetes.io/enable-cors: "true"这个注解会触发ingress-nginx的内置全局CORS逻辑,优先级高于你写的configuration-snippet条件判断,自动给所有请求加CORS头,导致你的域名过滤规则被覆盖。
正确配置方案
完全停用内置CORS自动配置,所有跨域逻辑通过configuration-snippet自定义实现,完整的Ingress注解如下:
# 注意:不要添加 nginx.ingress.kubernetes.io/enable-cors: "true" 注解 nginx.ingress.kubernetes.io/configuration-snippet: | # 匹配合法跨域源,多个允许的域名用|分隔,支持正则 if ($http_origin ~* "^(https://example.com|https://app.test.com)$") { set $cors "true"; more_set_headers "Access-Control-Allow-Origin: $http_origin"; more_set_headers "Access-Control-Allow-Credentials: true"; more_set_headers "Access-Control-Allow-Methods: GET, POST, PUT, DELETE, PATCH, OPTIONS"; more_set_headers "Access-Control-Allow-Headers: DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization"; more_set_headers "Access-Control-Max-Age: 1728000"; } # 处理OPTIONS跨域预检请求 if ($request_method = OPTIONS) { set $cors "${cors}options"; } if ($cors = "trueoptions") { more_set_headers "Content-Length: 0"; more_set_headers "Content-Type: text/plain; charset=utf-8"; return 204; }
验证方法
分别用合法和非法Origin发起请求测试:
- 非法Origin测试:
curl 'https://your-service-domain.com' -H 'Origin: https://hacker.org' -v
响应头中不会出现Access-Control-Allow-Origin相关字段,符合预期。
2. 合法Origin测试:
curl 'https://your-service-domain.com' -H 'Origin: https://example.com' -v
响应头中会返回完整的CORS相关字段,符合预期。
内容的提问来源于stack exchange,提问作者Mohamed chiheb Ben jemaa
相关产品推荐
相关产品推荐

