Nginx反向代理下CORS预请求转发问题咨询
解决Nginx反向代理时OPTIONS预请求无法转发至Go后端的问题
问题场景
使用Nginx作为反向代理时,浏览器发起的OPTIONS预请求被Nginx直接拦截并返回405 Method Not Allowed,完全没有转发到后端的Golang REST服务。后端已经通过github.com/rs/cors包配置了完整的CORS处理逻辑,但当前只能通过Nginx的location指令手动硬编码处理OPTIONS请求,无法根据不同路由动态调整Access-Control-Allow-Headers等配置,因此需要让所有OPTIONS请求直接转发到后端处理。
解决方案
核心思路是让Nginx放弃对OPTIONS请求的拦截,完全交由后端的CORS逻辑处理,只需修改Nginx配置即可:
修改后的Nginx配置(server.conf)
server { listen 80; server_name example.com; location / { proxy_pass http://localhost:3000; # 保留原有代理头配置 proxy_set_header X-Original-URI $request_uri; proxy_set_header X-Original-Remote-Addr $remote_addr; proxy_set_header X-Original-Host $host; # 确保Nginx不拦截OPTIONS请求 proxy_http_version 1.1; proxy_set_header Access-Control-Request-Method ""; proxy_set_header Access-Control-Request-Headers ""; } }
配置说明
- 移除手动OPTIONS拦截逻辑:删除原配置中
if ($request_method = 'OPTIONS')的代码块,这个块会直接返回204并终止请求转发,是导致问题的核心原因。 - 适配HTTP协议与请求头:
- 设置
proxy_http_version 1.1保证跨域请求的协议兼容性 - 清空
Access-Control-Request-Method和Access-Control-Request-Headers头,避免Nginx对这些跨域专属头进行默认处理,确保后端能完整获取预请求的信息
- 设置
- 依赖后端CORS配置:你的Go服务已经通过
cors.AllowAll().Handler(mux)开启了全量跨域支持,后端会自动处理OPTIONS预请求,返回符合要求的CORS响应头(包括动态的Access-Control-Allow-Headers等)。
验证方法
- 重启Nginx加载新配置,启动Go服务
- 发起跨域请求,查看浏览器网络面板:
- OPTIONS预请求会被转发到后端,返回
204 No Content,同时携带后端生成的CORS响应头 - 后续的实际业务请求可以正常完成跨域访问
- OPTIONS预请求会被转发到后端,返回
内容的提问来源于stack exchange,提问作者Ahmed Mahmoud
相关产品推荐
相关产品推荐

