IE浏览器因XDomainRequest限制需Nginx动态设置Access-Control-Allow-Origin为白名单域名而非*,配合map指令匹配Origin、add_header注入响应头,并显式处理OPTIONS预检返回204,同时启用X-UA-Compatible: IE=edge确保标准模式。

IE浏览器(特别是IE10及以下版本)对标准CORS的支持不完整,它使用的是微软私有的 XDomainRequest 对象,该对象仅支持 GET 和 POST 方法、不携带 Cookie、不支持自定义请求头,且无法设置 Access-Control-Allow-Origin: * 与通配符配合 Access-Control-Allow-Credentials: true。因此,若后端需支持带凭证(如 Cookie)的跨域请求,IE 下必须将 Access-Control-Allow-Origin 设置为**明确的源(非通配符)**,而 Nginx 正是实现该逻辑的理想代理层。
关键配置:动态匹配并精确返回 Origin
Nginx 本身不支持条件判断响应头(如“若 Origin 存在则回写该值”),但可通过 map 指令预定义变量,在 server 或 location 块中安全注入。这是解决 IE 兼容的核心——避免 * 与 credentials 冲突。
在 http 块中添加:
map $http_origin $cors_origin {
default "";
"~^https?://(localhost:?[0-9]*|myapp\.example\.com|admin\.site\.org)$" $http_origin;
}
说明:
-
$http_origin是客户端实际发送的 Origin 请求头 -
~^...表示正则匹配,只允许白名单中的域名通过(如开发用localhost、生产用具体域名) - 匹配成功时,
$cors_origin被设为原始 Origin;不匹配则为空,后续响应头不生效
添加标准 CORS 响应头(兼容现代浏览器 + IE)
在对应 location 块中加入以下指令:
add_header 'Access-Control-Allow-Origin' $cors_origin; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization'; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
注意点:
-
Access-Control-Allow-Origin使用$cors_origin变量,确保 IE 收到的是具体域名而非* -
Access-Control-Allow-Credentials: true必须与非通配符Origin同时存在,否则 IE 拒绝响应 -
OPTIONS预检请求需被正确处理(见下一点)
显式处理 OPTIONS 预检请求
IE10+ 在发送带凭证或自定义头的跨域请求前,会先发 OPTIONS 请求。Nginx 需直接返回 204(无内容),不转发给后端:
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' $cors_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
说明:
- 所有 CORS 头需在
OPTIONS响应中重复声明,IE 严格校验 -
return 204终止流程,避免触发后端逻辑 -
Content-Length: 0和Content-Type是部分 IE 版本要求的兜底字段
补充:禁用 IE 的兼容性视图(可选但推荐)
某些企业内网环境 IE 会强制启用兼容模式,导致 XDomainRequest 不可用或行为异常。可在 Nginx 中注入 HTTP 响应头强制标准模式:
add_header 'X-UA-Compatible' 'IE=edge';
也可在 HTML 的 中加 meta 标签,但服务端统一控制更可靠。










