问题背景
最近在私有 NAS 系统上通过 Docker 部署了 OGame Vue TS——一款基于浏览器的太空策略游戏单机版。该游戏支持通过 WebDAV 协议实现云存档同步功能。为了管理游戏存档,我在同一台 NAS 上运行了 hacdias/webdav 容器作为 WebDAV 服务器。配置完成后,在 Zotero 等其他应用中连接 WebDAV 服务一切正常,但在 OGame 游戏界面测试连接时却遇到了错误提示:"网络错误,可能是 CORS 限制。建议使用支持 CORS 的 WebDAV 服务或通过代理访问。"
问题分析
CORS(跨域资源共享)是浏览器的安全机制,限制网页从一个域名发起的请求访问另一个域名的资源。虽然其他客户端应用(如 Zotero)不受此限制,但 OGame Vue TS 完全在浏览器中运行,因此浏览器会严格执行 CORS 策略。
检查 hacdias/webdav 的配置后发现,尽管已启用 CORS,但 allowed_hosts 配置不完整。浏览器实际访问 OGame 的地址未列入白名单,导致 Preflight 请求被拦截。
解决方案
核心问题在于 WebDAV 服务的 CORS 配置未包含浏览器访问游戏时使用的完整地址。以下是具体修复步骤:
1. 确定访问地址
首先确认你通过浏览器访问 OGame 的完整 URL,包括协议、IP/域名和端口。常见的形式如:
http://192.168.1.x:端口(局域网 IP)
http://localhost:端口(本地访问)
https://your-domain.com(自定义域名)
2. 修改 WebDAV 配置
编辑 WebDAV 服务的 config.yml 文件,重点更新 cors 部分:
cors:
enabled: true
credentials: true
# 关键:列出所有可能访问OGame的完整地址
allowed_hosts:
- http://localhost:8091
- http://127.0.0.1:8091
- http://192.168.1.100:8091 # 替换为你的实际NAS IP和端口
- https://ogame.example.com # 如有域名访问方式
# 允许所有必要的请求头(使用通配符简化配置)
allowed_headers:
- "*"
# 必须包含完整的WebDAV方法集
allowed_methods:
- GET
- POST
- OPTIONS
- PUT
- DELETE
- PROPFIND # WebDAV核心方法
- PROPPATCH
- MKCOL
- COPY
- MOVE
- HEAD
- LOCK
- UNLOCK
exposed_headers:
- Content-Length
- Content-Range
- ETag
- DAV
3. 重启服务
停止 WebDAV Docker 容器
保存配置文件
重新启动容器
清除浏览器缓存后测试连接
原理解析
为什么其他应用正常而浏览器端出错?
非浏览器客户端(如 Zotero)直接发起 HTTP 请求,不受 CORS 限制
浏览器环境会先发一个 OPTIONS 预检请求,检查目标服务器是否允许当前来源访问
如果 allowed_hosts 不包含浏览器地址栏的完整来源,服务器返回的 CORS 头信息不匹配,浏览器就会阻止后续请求
为什么需要完整的 WebDAV 方法?
WebDAV 协议扩展了 HTTP,包含 PROPFIND、LOCK 等特定方法。如果 allowed_methods 未声明这些方法,预检请求会失败,导致读写操作无法进行。
注意事项
IP与端口的精确匹配:allowed_hosts 必须包含协议、IP/域名和端口,任一不匹配都会导致 CORS 失败
通配符的权衡:生产环境建议明确列出地址而非使用 * 通配符,但开发环境可简化配置
缓存问题:浏览器会缓存 CORS 策略,配置修改后务必清除缓存或使用无痕模式测试
替代方案简述
若无法修改 WebDAV 配置,也可通过 Nginx 反向代理将 OGame 和 WebDAV 部署在同一域名下,从根本上规避跨域问题。此方法配置稍复杂但更优雅,适合有代理服务环境的用户。
总结
浏览器端的 CORS 问题本质上是安全策略限制。通过完善 WebDAV 服务的 CORS 配置,明确授权游戏页面的访问来源,即可实现 OGame Vue TS 的存档云同步功能。关键在于确保 allowed_hosts 包含浏览器实际访问的完整地址,并正确配置 WebDAV 所需的 HTTP 方法。