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

Heroku部署的Go API使用gorilla/handlers配置CORS预检请求异常失败

问题根因

  1. 跨域预检请求本质是OPTIONS类型的请求,你当前仅为/api/login、/api/recommendations路由注册了GET方法,没有注册OPTIONS方法,导致gorilla/mux直接返回405 Method Not Allowed,即便CORS中间件返回了正确的跨域头,预检也会判定失败。
  2. 普通curl请求未携带Origin头时,CORS中间件不会返回Access-Control-Allow-Origin头,这是CORS的标准处理逻辑,不是Chrome删除了该响应头。
  3. 你测试预检请求时使用了--head参数,实际发送的是HEAD请求而非OPTIONS请求,属于测试方法错误。

解决步骤

  • 给所有需要跨域访问的路由增加OPTIONS方法支持
    修改路由注册代码:
    router.HandleFunc("/api/login", user.LoginHandler).Methods("GET", "OPTIONS")
    router.HandleFunc("/api/recommendations", preventative_care.RecommendationHandler).Methods("GET", "OPTIONS")
    
  • (可选,批量处理所有OPTIONS请求)如果路由数量较多,可以全局注册OPTIONS请求处理逻辑,避免每个路由单独添加:
    // 放在所有路由注册完成之后添加
    router.Methods("OPTIONS").HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
    })
    
  • (可选,避免通配符兼容问题)明确指定允许的请求头,替换原来的通配符配置,降低旧版本gorilla handlers的兼容风险:
    headersOk := handlers.AllowedHeaders([]string{"Content-Type", "username", "password"})
    
  • 正确验证预检请求的命令:
    curl -X OPTIONS -H "Access-Control-Request-Method: GET" -H "Origin: https://my-app-staging.herokuapp.com" -i https://my-app-api.herokuapp.com/api/login
    
    正常返回200状态码+Access-Control-Allow-Origin头即说明配置生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:27:03