跨域请求错误:如何为 Go 服务器正确配置 CORS 响应头


当前端页面(如 http://localhost:9009)通过 ajax 向不同端口的 go 后端(如 http://localhost:9090)发起请求时,因端口不同触发浏览器同源策略限制,需在 go 服务端显式添加 `access-control-allow-origin` 等 cors 头才能成功通信。

该错误本质是浏览器的同源策略(Same-Origin Policy)强制拦截了跨源请求。虽然 localhost:9009 和 localhost:9090 域名相同,但端口(9009 ≠ 9090)不同,即构成不同源(scheme + host + port 三者必须完全一致)。此时,浏览器在发送实际请求(如 POST)前会先发一个预检请求(OPTIONS),并要求目标服务器响应中包含合法的 CORS 头,否则拒绝后续请求。

要解决此问题,需在你的 Go HTTP 服务端中间件或处理函数中添加标准 CORS 响应头。以下是一个简洁、安全、生产可用的实现示例(使用标准 net/http,无需额外依赖):

func corsMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 允许指定源(开发阶段可设为 "*",但注意:若需携带 credentials,则不能为 "*")
        w.Header().Set("Access-Control-Allow-Origin", "http://localhost:9009")
        // 允许的请求方法
        w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
        // 允许的请求头
        w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With")
        // 允许客户端携带 cookie(如需登录态)
        w.Header().Set("Access-Control-Allow-Credentials", "true")
        // 指定预检请求缓存时间(秒)
        w.Header().Set("Access-Control-Max-Age", "86400")

        // 处理预检请求(OPTIONS)
        if r.Method == "OPTIONS" {
            w.WriteHeader(http.StatusOK)
            return
        }

        next.ServeHTTP(w, r)
    })
}

// 使用示例
func main() {
    http.Handle("/receive", corsMiddleware(http.HandlerFunc(receiveHandler)))
    log.Println("Server starting on :9090")
    log.Fatal(http.ListenAndServe(":9090", nil))
}

⚠️ 注意事项

  • 开发环境可临时设 "Access-Control-Allow-Origin": "*" 快速验证,但上线前务必替换为明确的可信源(如 "http://yourdomain.com"),尤其当启用 Access-Control-Allow-Credentials: true 时,* 将被浏览器拒绝;
  • 若前端 Dropzone 配置了 withCredentials: true(用于传递 Cookie 或认证头),后端必须同时设置 Allow-Credentials: true 且 Allow-Origin 不能为通配符;
  • Nginx 反向代理层不能替代后端 CORS 配置——CORS 是由最终响应的服务器(即你的 Go 服务)决定的,Nginx 仅作转发,不生成 CORS 头(除非你显式在 Nginx 配置中添加 add_header,但推荐统一由应用层控制更可靠);
  • 确保 receiveHandler 中的业务逻辑不覆盖或清空上述已设置的 Header。

✅ 总结:该问题与前端代码或 Nginx 配置无关,根源在于 Go 服务未声明跨域许可。只需在 HTTP 处理链中注入 CORS 中间件,正确设置响应头并妥善处理 OPTIONS 预检,即可彻底解决 No 'Access-Control-Allow-Origin' header is present 错误。


# 前端  # ajax  # go  # nginx  # cookie  # 浏览器  # access  # 端口  # 后端  # ai  # 跨域  # 开发环境  # red  # 中间件 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Python抽象类与接口设计_规范说明【指导】  如何在Golang中处理数据库事务错误_回滚和日志记录  C++如何获取CPU核心数?(std::thread::hardware_concurrency)  php错误怎么开启_display_errors与log_errors的设置【汇总】  Linux怎么设置磁盘配额_Linux系统Quota安装与用户空间限制【教程】  如何使用Golang table-driven fuzz测试_多数据随机化发现缺陷  Mac如何解压zip和rar文件?(推荐免费工具)  Python文件管理规范_工程实践说明【指导】  Python变量绑定机制_引用模型解析【教程】  C#如何使用Channel C#通道实现异步通信  php8.4如何调用com组件_php8.4windows下com操作指南【教程】  Python与MongoDB NoSQL开发实战_文档模型与索引优化  Windows10电脑怎么设置文件权限_Win10安全选项卡所有者修改  Windows11怎样开启游戏模式_Windows11游戏模式开启攻略【方法】  VSC怎样用终端运行PHP_命令行执行脚本的步骤【教程】  Windows 11如何查看系统激活密钥_Windows 11使用CMD或PowerShell命令找回Product Key  c++中如何使用虚函数实现多态_c++多态性实现原理  Win11怎么退出微软账户_切换Win11为本地账户登录方法【详解】  C++中的协变与逆变是什么?C++函数指针与返回类型详解【类型系统】  php增删改查报错1054怎么办_字段名错误排查修复【解答】  php嵌入式日志记录怎么实现_php将硬件数据写入本地日志文件【指南】  mac怎么打开终端_MAC终端Terminal使用入门与常用命令【教程】  MySQL 中使用 IF 和 CASE 实现查询字段条件化显示  php下载安装选zip还是msi格式_两种安装包对比【教程】  Win11怎么更改输入法顺序_Win11调整语言首选位置【设置】  mac怎么安装adb_MAC配置Android ADB开发环境【详解】  Win11如何设置ipv6 Win11开启IPv6网络协议教程【步骤】  手机php文件怎么变成mp4_安卓苹果打开php转mp4方法【教程】  如何在 Python 测试中动态配置 @backoff 装饰器的重试次数  Win11系统占用空间大怎么办 Win11深度瘦身清理指南【优化】  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  短链接怎么用php递归还原_多层加密链接的处理法【详解】  Python高性能计算项目教程_NumPyCythonGPU并行加速  Win11怎么设置虚拟内存最佳大小_Windows11性能选项自定义分页文件  如何在 Go 中正确反序列化 XML 多节点数组(解决仅解析首个元素的问题)  为什么本地php环境运行php脚本卡顿_php执行效率优化方法与设置【说明】  php在Linux怎么部署_LNMP环境搭建PHP服务的详细指南【指南】  php修改数据怎么改富文本_update更新html内容注意事项【说明】  用Python构建微服务架构实践_FastAPI与Django对比详解  Python性能剖析高级教程_cProfileLineProfiler优化案例解析  win11 OneDrive怎么彻底关闭 Win11禁用并卸载OneDrive教程【分享】  Linux如何申请SSL免费证书_Linux下Certbot安装与Nginx自动续期【指南】  Windows服务持续崩溃怎样修复_系统服务保护机制解析  Win11玩游戏全屏闪退怎么办_Win11全屏优化禁用设置【教程】  PythonWeb前后端整合项目教程_FastAPIReact完整实例  MAC怎么用连续互通相机里的“桌上视角”_MAC在视频通话中同时展示人脸和桌面  Win10系统怎么查看端口状态_Windows10 CMD查看网络连接  如何使用Golang编写单元测试_创建Test函数验证业务逻辑  Python列表推导式与字典推导式教程_简化代码高效写法  c++怎么操作redis数据库_c++ hiredis库连接与命令执行【实战】 

 2026-01-04

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.