Heroku部署的Go API使用gorilla/handlers配置CORS预检请求异常失败
问题根因
- 跨域预检请求本质是
OPTIONS类型的请求,你当前仅为/api/login、/api/recommendations路由注册了GET方法,没有注册OPTIONS方法,导致gorilla/mux直接返回405 Method Not Allowed,即便CORS中间件返回了正确的跨域头,预检也会判定失败。 - 普通curl请求未携带Origin头时,CORS中间件不会返回
Access-Control-Allow-Origin头,这是CORS的标准处理逻辑,不是Chrome删除了该响应头。 - 你测试预检请求时使用了
--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"}) - 正确验证预检请求的命令:
正常返回200状态码+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/loginAccess-Control-Allow-Origin头即说明配置生效。
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

