iframeの「接続が拒否されました」:原因と直し方

iframeの「接続が拒否されました」

iframeの「接続が拒否されました」:原因と対処法、チェッカー付き | We.Inc

iframeに「接続が拒否されました」と表示される原因は、埋め込み先ページのX-Frame-OptionsかCSPのframe-ancestorsです。レスポンスヘッダーを貼り付けて判定を確認し、サーバー側の修正をコピーできます。

灰色の「接続が拒否されました」という表示は、iframe内のページがブラウザーに対して、フレーム内での表示を禁止したことを意味します。その指示はX-Frame-Optionsレスポンスヘッダー(DENYまたはSAMEORIGIN)か、Content-Security-Policyのframe-ancestorsルールで行われます。解除できるのは埋め込まれる側のサーバーだけです。下にヘッダーを貼り付けると、どのルールでブロックされているかがわかります。

各ヘッダー値がiframeに与える意味

このエラーはネットワーク障害ではなく、iframeタグにも問題はありません。ブラウザーはページを取得し、フレーム表示を禁じるヘッダーを読み取って、中身をエラーに置き換えたのです。理由はクリックジャッキング対策です。誰でもフレームに入れられるページは、透明なボタンを上に重ねられてしまいます。対処法は、どのサーバーがヘッダーを送ったかによって変わります。

よくある質問

自分のページから「接続が拒否されました」を回避できますか?

できません。このルールは埋め込まれるサイトに代わって訪問者のブラウザーが強制しており、iframeのどの属性でも上書きできません。方法は、埋め込まれるサイトのヘッダーを変える、そのサイトがフレーム用に提供する埋め込みURLを使う、リンクにする、のいずれかだけです。

自分のサイトが自分のiframeで読み込めないのはなぜですか?

X-Frame-Options: DENYやframe-ancestors 'none'がないか確認してください。どちらも同じドメインのページを含め、すべての親をブロックします。SAMEORIGINかframe-ancestors 'self'に変更しましょう。サブドメインやポートが違えば別のオリジンになる点にも注意してください。

X-Frame-Optionsとframe-ancestors、どちらを使うべきですか?

frame-ancestorsを使いましょう。許可する親を複数指定でき、両方がある場合は常にこちらが優先されます。X-Frame-Optionsも送る場合は、次に設定を読む人が誤解しないよう、CSPのルールと矛盾しないようにしておきます。

動画や地図のリンクで接続が拒否されるのはなぜですか?

通常の視聴ページや場所のページは、たいていフレーム表示を禁じるヘッダーを送っています。一方でサービス側は、iframe用の別の埋め込みアドレスを公開しており、多くは「共有」から「埋め込む」の中にあります。当社の埋め込みコードジェネレーターは、対応するリンクをその埋め込みアドレスに変換します。

frame-ancestorsはすべての親フレームをチェックしますか?

はい。iframeが別のiframeの中にある場合、直接の親だけでなく、最上位ページまでのすべての祖先がポリシーに一致する必要があります。

エラーではなくヘッダーを読む

自分が管理するサーバーで直す

自分のサイトではない場合

コピーして使えるサーバー側の修正

どの例も同じサイトと1つのパートナーを許可します。https://partner.example は、あなたのページをフレーム表示できるべきオリジンに置き換えるか、全員をブロックするなら 'none' を使ってください。

always を付けると、エラーページでもヘッダーが送られます。2つのルールがずれないよう、古いX-Frame-Optionsの行は削除しましょう。

Apache(.htaccessまたはバーチャルホスト)

mod_headersが必要です。Header always setは、同じヘッダーの以前の値を置き換えます。

ExpressとHelmet

HelmetはデフォルトでX-Frame-OptionsをSAMEORIGINに設定します。それを無効にしてframe-ancestorsを設定すれば、設定元を1つにまとめられます。

Next.js(next.config.js)

headers()は、一致するすべてのルートにレスポンスヘッダーを追加します。ホスティングサービスが独自のヘッダーを加えることがあるため、後で本番のレスポンスを確認しましょう。

レスポンスヘッダーチェッカー

iframe内に表示するページのレスポンスヘッダーを貼り付けてください。処理はすべてこのページ内で行われ、何も取得しません。

埋め込まれるページのレスポンスヘッダー

iframeを置くページのオリジン

埋め込まれるページのオリジン

サンプルのヘッダーに戻す

判定

この親ページはこのページをフレーム表示できます。

ブラウザーはこのページをiframe内に表示することを拒否します。

まだはっきりした判定は出ていません。

Content-Security-Policy: frame-ancestors 'none' によりブロックされます。

frame-ancestorsにより許可されます:{v} が親のオリジンに一致します。

frame-ancestorsによりブロックされます:リスト内のどのソースも {v} に一致しません。

X-Frame-Optionsはありますが、frame-ancestorsが判定するため無視されます。

X-Frame-Options: DENY によりブロックされます。

X-Frame-Options: SAMEORIGIN で、オリジンが一致するため許可されます。

X-Frame-Options: SAMEORIGIN で、{v} は別のオリジンのためブロックされます。

ALLOW-FROMは廃止済みで無視されるため、ブロックしません。

X-Frame-Optionsに異なる値が複数あります。値は1つだけ送ってください。

Content-Security-Policy-Report-Onlyは決してブロックしないため、スキップしました。

フレーム表示に関するヘッダーが見つからないため、どのサイトでもこのページをフレーム表示できます。

両方のオリジンを完全なURLで入力してください。例:https://example.com

無料で始める · クレジットカード不要

関連: ガイド|Webマーケティングと集客を学ぶ

製品

ご利用いただける方

機能

リソース

会社情報

サイトマップを見る