默认行为与问题
- 默认行为:
add_header指令仅在2xx/3xx成功响应中添加头部
- 问题场景:当后端返回4xx/5xx错误时,默认情况下跨域头会被丢弃
- 浏览器表现:前端收到错误响应但缺少
Access-Control-Allow-Origin头时,会触发CORS错误
# 错误示例:缺少always参数,4xx/5xx响应无跨域头
location /api {
add_header 'Access-Control-Allow-Origin' '*';
proxy_pass http://backend;
}
always参数的解决方案
- 强制生效:添加
always后,跨域头会在所有响应中存在
- 配置语法:
add_header 'Header-Name' 'value' always;
典型应用场景:跨域配置
基础跨域配置
location /api {
# 核心跨域头(必须带always)
add_header 'Access-Control-Allow-Origin' 'http://frontend.com' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization' always;
proxy_pass http://backend;
}
处理预检请求(OPTIONS)
location /api {
# 跨域头配置...
if ($request_method = 'OPTIONS') {
return 204;
}
proxy_pass http://backend;
}