V2 模型如何防盗链
WordPress 后台 → Live2D 设置 → 基础设置 → API 方式 决定模型从哪里加载、防盗链由谁挡。本页只讲「自定义新版模型」(V2 / Cubism 4+)的两种方式:直链加载 与 托管到本站。
V1 模型不走这一页。 V1 模型本身就由插件本地 REST 接口(
/wp-json/live2d/v1/model/*)发出,不需要再加一层防盗链。本页所有内容只针对 V2 模型。
选项 A:直链加载(适合已经在用对象存储 / CDN 的站长)
这种模式下插件不动你的 modelAPI,把它原封不动地交给浏览器去加载。防盗的事交给对象存储或 CDN 自己挡。常见三种做法(从简单到复杂):
1. 公共读 + Referer 白名单(最简单)
- 阿里云 OSS:Bucket → 数据安全 → 防盗链,把你的网站域名加进白名单。
- 腾讯云 COS:存储桶 → 安全管理 → 防盗链设置,操作类似。
- 原理:浏览器加载模型时会带 Referer,不在白名单的来源直接 403。
- 局限:稍微懂抓包的人能伪造 Referer 绕过。日常用够了。
2. 套一层自家 CDN,开 URL 鉴权
在 OSS 前面套阿里云 CDN / 腾讯云 CDN / Cloudflare,开启「URL 鉴权」或「Token 校验」,再把 modelAPI 填成带签名地址。这种比纯 Referer 严,但配置稍复杂。
3. 私有读 + 签名链接(最严格)
Bucket 设成私有,每次访问都带签名才能下载。这种模式不能直接在插件设置页里配置,需要懂 PHP 的人在主题 functions.php 里写代码动态生成签名 URL。本插件 不内置 任何具体云厂商 SDK,原因见 FAQ。
选项 B:托管到本站(推荐 / 适合没法配防盗链的源)
选这个之后,模型文件会被保存到你自己的 WordPress 站点(wp-content/plugins/live-2d/model/{slug}/),并对外只露出一个加密过的临时签名 URL:
- 访客 F12 看到的也是这个临时 URL,不会暴露源站地址。
- 每个文件有别名(hash 化路径),别人猜不到。
- 2026-05 之后只支持站长手动触发下载或上传,不再有访客访问时的「自动懒下载」。
选了「托管到本站」之后表单怎么变
选这一项后,modelAPI 输入框会自动隐藏,系统会把它强制写成本站的 wp-content/plugins/live-2d/model/ 根地址。站长唯一需要填的就是 modelDir 列表,每行写一个 slug(= 子目录名),插件会按 {root}{slug}/{slug}.model3.json 的固定模板自动展开成完整的 manifest URL。
例如要加载 haru / Pio / shizuku 三个模型:
modelDir:
- haru
- Pio
- shizuku
插件会自动展开为:
https://your-site.com/wp-content/plugins/live-2d/model/haru/haru.model3.json
https://your-site.com/wp-content/plugins/live-2d/model/Pio/Pio.model3.json
https://your-site.com/wp-content/plugins/live-2d/model/shizuku/shizuku.model3.json
实际访客拿到的 URL 都是 /wp-json/live2d/v2/m/{token}/{alias}?e=&s= 这样的临时签名链路,源站再被改成 404 或防盗都不影响。
方式 1:从 URL 下载(模型已经有公网 URL)
- 把「API 方式」切到 自定义新版模型 · 托管到本站,保存。
- 页面下方会出现「模型托管」面板,默认在「从 URL 下载」tab。
- 在「模型源 URL」输入框填模型的
.model3.json完整公网 URL(比如https://example.com/haru/haru.model3.json),点「下载到本站」。 - 插件会从 URL 派生出 slug(比如
haru),立刻把它追加到上方modelDir列表,同时把整套模型文件入队,后台 cron 拉取到model/haru/。 - 所有 job 状态变成"已缓存"后,前台就走本地副本了。记得点页面底部「保存设置」,modelDir 才会写入数据库。
方式 2:上传文件夹(模型只在本地)
- 把「API 方式」切到 自定义新版模型 · 托管到本站,保存。
- 切到「模型托管」面板的「上传文件夹」tab,把整个模型目录(包含
.model3.json+.moc3+ 贴图 + 动作)拖到虚线框,或点击「选择文件夹」按钮选目录。 - 插件按相对路径串行上传到
model/{slug}/(slug 自动取你拖入的根目录名),进度条实时反映已上传字节。 - 上传完成后 slug 会自动追加到上方
modelDir列表。 - 顶部黄色横幅会显示当前服务器单文件上传上限(由 PHP
upload_max_filesize决定)。超过该上限的文件会被红色标记跳过,不会让 PHP 后台静默丢包。如果模型贴图普遍偏大,需要联系主机商或在wp-config.php/.htaccess调高upload_max_filesize与post_max_size。 - 上传完成后记得点页面底部「保存设置」,modelDir 才会写入数据库。
典型适用场景
- 模型放在 GitHub Pages / GitHub Raw / jsDelivr。
- 模型放在朋友的服务器,没法让对方加 Referer 白名单。
- 购买了第三方付费模型,对方只给一个公开 URL,你不希望被白嫖。
- 担心对象存储「按流量计费」账单失控。
- 模型只在本地(没有任何公网 URL),想直接拖进去就完事。
FAQ
为什么插件不直接帮我接 OSS 私有读?
经常有人问「为啥不能让插件自己拿我的 OSS AccessKey 去签名转发?」三个原因:
- AccessKey 不能存数据库。 WordPress 的设置项是明文存的,万一数据库泄漏(被黑、备份外泄、共享主机出事),你的整个 OSS Bucket 就全没了,比模型被盗严重得多。
- 每家云的签名算法都不一样。 阿里云、腾讯云、AWS、Cloudflare R2、MinIO 各搞一套。做完一家就有人提"加 XX 云支持",没完没了。
- 真要用的人不需要插件帮忙。 能搞定 OSS 私有读的站长,自己写几行 PHP 比点设置页方便得多,也更安全(凭据可以走环境变量,不进数据库)。
想自己改代码接 OSS 签名链接?
目前插件没有提供专门的钩子给你拦截这个流程。如果实在想改,只能 fork 仓库,去 src/live2d-V2Api.php 里改 get_asset() / stream_local() 这两个函数,让它在命中你的私有 OSS 路径时返回一个 302 跳转到 OSS 预签名地址。
如果以后用这个功能的人多了,会考虑加一个正式的 live2d_v2_resolve_alias 钩子,但插件本身永远不会内置任何具体云厂商的 SDK。
如果你真打算这么干,请务必:
- 用最小权限的子账号(只给「读取对象」权限,限定到具体 Bucket / 目录)。
- 千万不要把 SecretKey 直接写进 WordPress 设置项里,用环境变量或专门的密钥管理服务。
- 对插件的 V2 防盗链 REST 路径加上 Referer 校验(在
wp-config.php中显式开启,参考live2d-V2Api.php注释)。