如何在自建AppRTC服务器中启用CORS跨域访问?
首先得纠正你一个关键错误:你在前端sendUrlRequest里设置的Access-Control-Allow-Origin和Access-Control-Allow-Headers是服务器端应该返回的响应头,不是前端请求头!前端强行加这些请求头反而会触发浏览器的预请求校验失败,导致你现在看到的“CORS request did not succeed”错误,赶紧把这两行代码删掉。
回到问题本质:跨域请求的权限完全由服务器控制,必须在你的AppRTC服务器端配置CORS规则,才能让其他IP的项目正常调用接口。下面针对你部署在VirtualBox中Google App Engine(GAE)的AppRTC,给出具体配置步骤:
1. 配置GAE主服务的CORS(针对/params等接口)
AppRTC的核心服务是Python编写的,通过app.yaml和代码来配置CORS:
方法一:修改app.yaml添加全局/路径级响应头
打开项目根目录的app.yaml,找到handlers节点,给需要跨域的路径(比如/params)添加CORS响应头:
handlers: # 保留原有的其他handler配置,添加/params的规则 - url: /params script: main.app http_headers: Access-Control-Allow-Origin: "*" # 允许所有域,也可以指定具体域名如http://xxx.xxx.xxx.xxx:port Access-Control-Allow-Methods: "GET, POST, OPTIONS" Access-Control-Allow-Headers: "Origin, X-Requested-With, Content-Type, Accept" # 如果需要所有接口都允许跨域,添加全局规则 - url: /* script: main.app http_headers: Access-Control-Allow-Origin: "*" Access-Control-Allow-Methods: "GET, POST, OPTIONS" Access-Control-Allow-Headers: "Origin, X-Requested-With, Content-Type, Accept"
方法二:在Python代码中处理OPTIONS预请求
浏览器发送跨域非简单请求时,会先发送OPTIONS预请求,服务器必须正确响应这个请求。打开main.py,找到处理/params的Handler类,添加OPTIONS方法的处理:
class ParamsHandler(webapp2.RequestHandler): # 新增OPTIONS方法处理预请求 def options(self): self.response.headers['Access-Control-Allow-Origin'] = '*' self.response.headers['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS' self.response.headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept' self.response.status = 200 # 原有的GET请求处理逻辑不变,同时在响应中添加CORS头 def get(self): # 保留原有的params获取逻辑 # ... # 添加CORS响应头 self.response.headers['Access-Control-Allow-Origin'] = '*' # 继续返回原有的响应内容 # ...
2. 配置Collider服务的CORS(如果有跨域调用需求)
AppRTC的Collider是Go语言编写的信令服务,如果你的项目也会跨域调用Collider接口,需要修改Collider的代码:
打开Collider目录下的main.go,在处理HTTP请求的函数中添加CORS响应头,并处理OPTIONS请求:
func handler(w http.ResponseWriter, r *http.Request) { // 设置CORS响应头 w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS, WebSocket") w.Header().Set("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept") // 处理OPTIONS预请求 if r.Method == "OPTIONS" { w.WriteHeader(http.StatusOK) return } // 保留原有的请求处理逻辑 // ... }
修改完成后,重新编译Collider:
go build collider/main.go
替换VirtualBox中运行的Collider可执行文件,重启Collider服务。
3. 重新部署并验证
- 重启VirtualBox中的GAE服务:
dev_appserver.py app.yaml
- 重启Collider服务(如果修改了Collider)。
- 现在从其他IP的项目中调用AppRTC的接口,应该就能正常获取
/params数据,不会再出现CORS错误了。
注意:如果你的生产环境需要更严格的安全控制,不要用*允许所有域,而是指定具体的项目域名,比如Access-Control-Allow-Origin: http://your-project-domain:port。
内容的提问来源于stack exchange,提问作者MOHAMMAD MAHFUZ HOSSAIN

