服务端开发者如何正确拒绝CORS预检请求?
服务端主动拒绝CORS请求的正确实现方法
CORS校验逻辑由浏览器原生实现,服务端要让跨域调用彻底失败,核心是不给浏览器返回任何跨域许可凭证,配合预检请求拦截即可,具体操作如下:
1. 优先拦截预检OPTIONS请求
所有非简单跨域请求,浏览器都会先发送OPTIONS方法的预检请求验证权限,你可以直接全局拦截这类请求:
- 对所有OPTIONS请求直接返回403/405状态码
- 不要返回任何CORS相关响应头,包括
Access-Control-Allow-Origin、Access-Control-Allow-Methods等
如果你完全不需要对外开放跨域调用,直接全局拦截所有OPTIONS请求即可,不用处理后续业务逻辑。
2. 处理无预检的简单跨域请求
简单请求(GET/HEAD/POST类型,且请求头符合简单头规范)不会触发预检,浏览器会直接发送实际业务请求,这种场景你只需要做两件事:
- 永远不要返回任何CORS相关的响应头,浏览器发现响应没有跨域许可凭证,会自动拦截响应内容,前端无法读取任何返回数据,同时抛出CORS报错
- 可选增强校验:主动读取请求头的
Origin字段,和自己的信任域名白名单对比,不在白名单内的请求直接返回403状态码即可
常见错误操作
- 不要返回
Access-Control-Allow-Origin: null,部分场景下浏览器会将null判定为合法源,反而放行请求 - 不要返回无效的
Access-Control-Allow-Origin值(比如随意填写非白名单域名),部分兼容性差的浏览器可能出现不可预期的放行逻辑,直接不返回该响应头才是最稳妥的方案 - 不需要主动断开连接或者返回空响应,只要没有CORS许可头,浏览器会自动拦截响应,已经达到拒绝跨域调用的效果
示例:Nginx全局拒绝所有跨域请求的配置
# 拦截所有OPTIONS预检请求直接返回403 if ($request_method = OPTIONS) { return 403; } # 不需要添加任何CORS相关的add_header配置即可
内容的提问来源于stack exchange,提问作者mcfedr
相关产品推荐
相关产品推荐

