V2 モデルのホットリンク防止
WordPress 管理画面 → Live2D 設定 → 基本設定 → API タイプ で、モデルをどこからロードし、ホットリンク防止を誰が担うかを決めます。本ページでは「カスタム新版モデル」(V2 / Cubism 4+)の 2 つの方式:直リンクロード と 本サイトにホスト のみを扱います。
V1 モデルはこのページには該当しません。 V1 モデルはプラグインのローカル REST エンドポイント(
/wp-json/live2d/v1/model/*)で配信されており、追加のホットリンク防止層は不要です。本ページの内容はすべて V2 限定です。
オプション A:直リンクロード(既にオブジェクトストレージ / CDN を使っているサイト管理者向け)
このモードでは、プラグインは modelAPI に手を加えず、そのままブラウザに渡してロードさせます。ホットリンク防止はオブジェクトストレージや CDN 側で行います。代表的な 3 つのアプローチ(簡単な順):
1. パブリックリード + Referer ホワイトリスト(最もシンプル)
- 阿里云 OSS:Bucket → データセキュリティ → ホットリンク防止に自サイトドメインを追加。
- 腾讯云 COS:ストレージバケット → セキュリティ管理 → ホットリンク防止設定で同様に。
- 仕組み:ブラウザがモデルをロードする際に Referer を送信し、ホワイトリスト外は 403 で弾く。
- 限界:パケットキャプチャに慣れた人なら Referer 偽装で回避できますが、日常用途には十分です。
2. 自前 CDN を被せて URL 認証を有効化
OSS の前段に阿里云 CDN / 腾讯云 CDN / Cloudflare を被せ、「URL 認証」または「トークン検証」を有効にし、modelAPI に署名付き URL を入れます。Referer のみより厳格ですが、設定はやや複雑になります。
3. プライベートリード + 署名 URL(最も厳格)
Bucket をプライベートにし、毎回署名付きでなければダウンロードできない設定。このモードはプラグインの設定画面では直接構成できません。PHP に詳しい人がテーマの functions.php で動的に署名 URL を生成するコードを書く必要があります。本プラグインは特定クラウドベンダーの SDK を 同梱しません。理由は FAQ を参照。
オプション B:本サイトにホスト(推奨 / ホットリンク防止を設定できないソース向け)
これを選ぶと、モデルファイルが自分の WordPress サイト(wp-content/plugins/live-2d/model/{slug}/)に保存され、外部には暗号化された一時的な署名 URL のみが公開されます:
- 訪問者が F12 で見える URL もこの一時 URL であり、ソースサイトの URL は漏れません。
- 各ファイルにエイリアス(ハッシュ化されたパス)が付き、推測困難です。
- 2026 年 5 月以降は サイト管理者が手動でダウンロード / アップロードを発火させる 方式のみサポートされ、訪問時の「自動遅延ダウンロード」は廃止されます。
「本サイトにホスト」を選ぶとフォームはどう変わる?
これを選ぶと modelAPI 入力欄は自動で隠れ、システムが自動で自サイトの wp-content/plugins/live-2d/model/ ルートに置き換えます。サイト管理者が入力する必要があるのは modelDir リストだけ で、1 行に 1 つの slug(= サブディレクトリ名)を書きます。プラグインは固定テンプレート {root}{slug}/{slug}.model3.json で完全な manifest URL に展開します。
例えば haru / Pio / shizuku の 3 モデルをロードする場合:
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 からダウンロード」タブが開きます。
- 「モデルソース URL」にモデルの
.model3.jsonの完全な公開 URL(例:https://example.com/haru/haru.model3.json)を入力し、「本サイトにダウンロード」をクリック。 - プラグインは URL から slug(例:
haru)を導出し、即座に 上のmodelDirリストに追加 し、モデルファイル一式をキューに入れて、バックグラウンドの cron がmodel/haru/に取得します。 - すべての job が「キャッシュ済み」になればフロントはローカルコピーを使用します。ページ下部の「設定を保存」を必ずクリックしてください。modelDir はこれでデータベースに書き込まれます。
方式 2:フォルダをアップロード(モデルがローカルにしかない)
- 「API タイプ」を カスタム新版モデル · 本サイトにホスト に切り替え、保存します。
- 「モデルホスティング」パネルで「フォルダをアップロード」タブに切り替え、モデルディレクトリ全体(
.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 をプラグインに預けて署名転送させてくれないのか?」とよく聞かれますが、理由は 3 つあります:
- AccessKey はデータベースに置けません。 WordPress の設定項目は平文保存です。データベースが漏れた場合(ハック、バックアップ流出、共有ホスト事故)、OSS Bucket がまるごと持っていかれます。モデルが盗まれるよりはるかに深刻です。
- クラウドごとに署名アルゴリズムが違います。 阿里云、腾讯云、AWS、Cloudflare R2、MinIO… 各社で別々です。1 社対応すれば次は「XX クラウドにも対応して」と続いてキリがありません。
- 本当に必要な人にはプラグインの助けが要りません。 OSS のプライベートリードを扱える管理者なら、設定画面をクリックするより自分で数行 PHP を書く方がはるかに早く、安全です(資格情報は環境変数経由でデータベースに置かれません)。
自分でコードを書いて OSS 署名 URL を扱いたい
現状プラグインは このフローを傍受する専用フックを提供していません。どうしても変更したい場合は、リポジトリを fork し、src/live2d-V2Api.php の get_asset() / stream_local() を編集して、プライベート OSS のパスにヒットしたとき OSS の事前署名 URL に 302 リダイレクトを返すようにします。
将来この機能を必要とする人が増えれば、正式な live2d_v2_resolve_alias フックの追加を検討しますが、プラグイン本体は永遠に特定クラウドベンダーの SDK を同梱しません。
もし本当にやるなら、必ず以下を守ってください:
- 最小権限の子アカウントを使う(「オブジェクト読取」のみ、特定 Bucket / ディレクトリにスコープ)。
- SecretKey を WordPress 設定欄に直接書かない。環境変数または専用シークレット管理サービスを使用。
- プラグインの V2 ホットリンク防止 REST パスに Referer 検証を追加する(
wp-config.phpで明示的に有効化、live2d-V2Api.phpのコメント参照)。