質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

2回答

810閲覧

同じサーバー、違うドメインでクロスドメイン制限?

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/06/19 01:52

ポップアップ風のウィンドウをhtmlのiframeを用いて実装しました。
プレビュー機能の実装をしています。

URLは都合上見せることはできません。申し訳ございません。
前提としては、同じサーバー内に

  • sample.com
  • sample2.com

というドメインがあります。

sample.comでプレビュー画面を押下すると、
sample2.comのpreview.htmlがiframeで呼ばれてポップアップのように表示されます。

しかし、google chromeのデベロッパーツールでみてみると以下のエラーが表示され
CSSを読み込むことができません。

txt

1Uncaught DOMException: Blocked a frame with origin "http://sample.com" from accessing a cross-origin frame. 2 at contents (https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js:5:23123) 3 at Function.map (https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js:4:6171) 4 at init.x.fn.<computed> [as contents] (https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js:5:23203) 5 at HTMLIFrameElement.<anonymous> (http://sample.com:28:24) 6 at HTMLIFrameElement.dispatch (https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js:5:14113) 7 at HTMLIFrameElement.v.handle (https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js:5:10850)

以下は、jQueryのコードです。
直接htmlに埋め込んでいます。

html

1sample.com/contents/main.html 2 <script> 3 4 //previewのiframeを追加 5 $(function(){ 6 $('#pre_iframe').append('<iframe src="http://sample2.com/contents/views/html/preview.html></iframe>'); 7 }); 8 9 //CSSをiframeに使用できるようにする 10 $(function(){ 11 $('#preview').on('load', function(){ 12 $('#preview').contents().find('head').append('<link rel="stylesheet" href="http://sample2.com/contents/.css">'); 13 $('body').css('overflow','hidden'); 14 }); 15 }); 16 17 //クローズイベント 18 $(document).on('click', '#close', function(){ 19 $('#preIframe').remove(); 20 $('body').css('overflow','scroll'); 21 }); 22 23 </script>

safariでは、「開発 > クロスオリジンの制限を無効にする」にチェックを入れれば綺麗に表示されます。

この場合、どのようにしてクロスドメイン制限を解除したら良いでしょうか。
JS上で解決できれば、それに越したことはないのですが、他に簡単な方法はないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

この場合、どのようにしてクロスドメイン制限を解除したら良いでしょうか。

埋め込まれるsample2.comの側にJavaScriptを仕掛けて、sample.comとのやりとりはpostMessageMDN)で行う、という手段になるかと思います。

(同じサーバなら、ドメインを揃えてしまうほうが早い気もしますが、それをできない事情はありますでしょうか)

投稿2019/06/19 01:56

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/19 01:58

>(同じサーバなら、ドメインを揃えてしまうほうが早い気もしますが、それをできない事情はありますでしょうか) こちらなのですが、ドメインを変えて管理画面とフロント画面で分けているため、 ドメインを揃えることができません。申し訳ございません。
退会済みユーザー

退会済みユーザー

2019/06/19 01:59

postMessageという手段について、少し調べてみます。 ヒントを頂きまして、ありがとうございます。
退会済みユーザー

退会済みユーザー

2019/06/19 02:05 編集

連投すいません。 JSは初心者なので、調べてみたのですが 以下のページより、 *postMessage* を参照して問題ないでしょうか? https://qiita.com/naoiwata/items/0a31d999b2dcd5098289
guest

0

sample.com側からの対応だけで制限を外すことができると、どのサイトに対してもスクリプトを外部から挿入できることになるため、セキュリティ上の問題で「できない」と思っておいた方がいいです。

2 つのドキュメントが同一のオリジンではない場合、 Window オブジェクトや Location オブジェクトなど、限られたオブジェクトにのみアクセスすることができます。

同一オリジンポリシー - Web セキュリティ | MDN

sample2.com側からの対応ですが、DOMAPIのアクセス制限は、CORSなどと違ってレスポンスヘッダを通じて許可することもできないので、maisumakunさんのおっしゃるとおり、sample2.com側にスクリプトを埋めるしかないと思います。

sample.comをsample2.comのサブドメインとすることでも対応できるかと思いますが、これも、sample2.com側での対応が必要になるかと思います。

ページのオリジンは、いくつかの制限の下で変更されることがあります。スクリプトを用いると、 document.domain の値を現在のドメインまたは上位ドメインに変更できます。

同一オリジンポリシー - Web セキュリティ | MDN

投稿2019/06/19 02:21

Lhankor_Mhy

総合スコア36087

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/19 02:30

ご回答ありがとうございます。 sample2.comの方にスクリプトを埋め込むしかないこと、承知しました。 また、maisumakunさんにも質問させていただいているのですが、 https://qiita.com/naoiwata/items/0a31d999b2dcd5098289 こちらのpostMessageを参照して実装したら良いでしょうか? このquiitaの記事だと、sample.comと、sample2.comの両方に postMessageを使うための実装をしなければならない様なのですが、 sample2.comの方にだけスクリプトを埋め込めば、完結する処理なのでしょうか?
Lhankor_Mhy

2019/06/19 02:36

いえ、両方です。 ただ、ご提示のスクリプトは「iframeで呼ばれたときだけ表示を変える」というものだと思うので、それなら、sample2.com側でwindow.parent で「自分がiframeで呼ばれているか」を識別して、表示を変えればいいのではないかな、と感じています。 もっと複雑なことをしているなら、postMessage でやり取りをするしかないでしょう。
退会済みユーザー

退会済みユーザー

2019/06/19 02:42

なるほど、わかりました! ご丁寧にありがとうございます。 Lhankor_Mhyさんのおっしゃた通り、 前者を試してみてから、postMessageを使ってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問