CORS 跨域、HTTP 混合内容与 HTTPS 升级
CORS 跨域政策
症状
Console 里红色报错:
Access to fetch at '...swf' from origin '...' has been blocked by CORS policy:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
根本原因
Ruffle Web 版内部用 fetch() API 加载 SWF。浏览器对 fetch 请求有跨域限制——如果 SWF 所在的服务器没返回 Access-Control-Allow-Origin 响应头,浏览器就直接拦。
解法
解法 A:SWF 放在自己服务器(推荐)
最简单——SWF 和页面同域同源,完全不涉及跨域。自己维护老 Flash 内容的站长,把 SWF 跟页面放一个域名下就行。
解法 B:给 SWF 服务器加 CORS 头
如果 SWF 必须从别的域名加载(比如 CDN),在那个域名的服务器上给 .swf 响应加头:
Access-Control-Allow-Origin: *
Nginx:
location ~* \.(swf|xml|mp3|png|jpg)$ {
add_header Access-Control-Allow-Origin *;
}
Apache:
<FilesMatch "\.(swf|xml|mp3|png|jpg)$">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
解法 C:Cloudflare Transform Rule(最简单)
Cloudflare 有免费的响应头 Transform Rule,匹配 .swf 后缀然后加 Access-Control-Allow-Origin: * 就行,5 分钟搞定。
解法 D:代理中转(临时调试)
如果 SWF 在别人服务器上、且你改不了 CORS——本地起个 Node / Python 代理把请求转发一下,能绕过去。但这只是调试用,上线必须回到 A 或 B。
混合内容(Mixed Content)
症状
Console 里红色报错:
Mixed Content: The page at 'https://...' was loaded over HTTPS, but requested an insecure ... This request has been blocked.
根本原因
现代浏览器(Chrome 80+、Edge 80+、所有 Safari)禁止 HTTPS 页面里加载 HTTP 资源——包括脚本、图片、音频、视频、fetch 请求。
解法
Ruffle 默认 upgradeToHttps: true,尝试把 HTTP URL 自动升级成 HTTPS。但升级后的 HTTPS URL 如果不存在(服务器上没配 HTTPS),还是失败。
三条路:
- 开启目标站点的 HTTPS(最推荐,Cloudflare 一键开)
- 手动修 SWF 里写死的 HTTP URL(用 JPEXS 反编译 SWF,把里面硬编码的 HTTP URL 改成 HTTPS)
- 在 SWF 加载器里自己写脚本拦截 HTTP 请求(高级,一般人用不到)
临时关 upgradeToHttps 试试
RufflePlayer.config 里设 upgradeToHttps: false。但注意关掉之后混合内容会被浏览器直接拦——除非你的页面本身也是 HTTP(2026 年几乎没有正常网站会这样)。
CSP(Content-Security-Policy)头
如果你的网站启用了严格 CSP,需要确保:
Content-Security-Policy:
script-src 'self' https://unpkg.com;
default-src 'self';
worker-src 'self' blob:;
wasm-unsafe-eval;
关键:worker-src blob: 或 'wasm-unsafe-eval'——WebAssembly 编译需要。现代 Chrome / Edge / Firefox 从 2023 年开始支持 'wasm-unsafe-eval' 这个 CSP 关键字,更安全。
快速自查清单
- [ ] CORS:SWF 放在自己服务器,或者服务器加
Access-Control-Allow-Origin: * - [ ] Mixed Content:开 HTTPS,或手动修 SWF 里写死的 HTTP URL
- [ ] CSP:加
worker-src blob:或'wasm-unsafe-eval' - [ ] 本地起代理确认是 CORS 问题还是别的