You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 "";
    }
}

配置说明

  1. 移除手动OPTIONS拦截逻辑:删除原配置中if ($request_method = 'OPTIONS')的代码块,这个块会直接返回204并终止请求转发,是导致问题的核心原因。
  2. 适配HTTP协议与请求头:
    • 设置proxy_http_version 1.1保证跨域请求的协议兼容性
    • 清空Access-Control-Request-Method和Access-Control-Request-Headers头,避免Nginx对这些跨域专属头进行默认处理,确保后端能完整获取预请求的信息
  3. 依赖后端CORS配置:你的Go服务已经通过cors.AllowAll().Handler(mux)开启了全量跨域支持,后端会自动处理OPTIONS预请求,返回符合要求的CORS响应头(包括动态的Access-Control-Allow-Headers等)。

验证方法

  1. 重启Nginx加载新配置,启动Go服务
  2. 发起跨域请求,查看浏览器网络面板:
    • OPTIONS预请求会被转发到后端,返回204 No Content,同时携带后端生成的CORS响应头
    • 后续的实际业务请求可以正常完成跨域访问

内容的提问来源于stack exchange,提问作者Ahmed Mahmoud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:02:12