HTTPSページでHTTP AJAX操作を実行すると、「混合コンテンツがブロックされる」


108

crm(ViciDial)に(この方法で必要なため、GETを介して)送信するフォームを持っています。フォームを正常に送信できますが、その場合、crmの処理ファイルは成功テキストをエコーするだけで、それだけです。

そのテキストの代わりに、ウェブサイトにお礼ページを表示したいので、AJAXを使用してフォームを送信し、必要なページにリダイレクトすることにしましたが、ブラウザーでこのエラーが発生します。

混合コンテンツ:「https://page.com」のページはHTTPS経由で読み込まれましたが、安全でないXMLHttpRequestエンドポイント ' http://XX.XXX.XX.XXX/vicidial/non_agent_api.php?queries=query=dataをリクエストしました'。このリクエストはブロックされました。コンテンツはHTTPS経由で提供する必要があります。

これは私のAJAXスクリプトです:

    <script>
    SubmitFormClickToCall = function(){

        jQuery.ajax({
            url: "http://XX.XXX.XX.XX/vicidial/non_agent_api.php",
            data : jQuery("#form-click-to-call").serialize(),
            type : "GET",
            processData: false,
            contentType: false,
            success: function(data){
                window.location.href = "https://www.example.com/thank-you";
            }
        });
    }
    </script>

URLにhttpsを設定するだけでは機能しません。GETを介してデータを送信し、ユーザーを感謝ページにリダイレクトする方法はありますか?

============================

ここでの問題は混合コンテンツでした。これは、HTTPSを介してページをロードし、HTTPにあるAPIをAJAX経由でヒットしようとしたことを意味します。しかし、ブラウザではそれを行うことはできません。

したがって、APIをHTTPSに設定できない場合(これは私のケースでした)、別の方法でこれにアプローチできます。

主な問題は、混合コンテンツの問題ではなく、APIにデータを送信して、ユーザーをファンシーなありがとうページにリダイレクトすることでした。AJAXを使用する代わりに、データを受信するphpファイルを作成し、curlを使用してそれをAPIに送信します(これはサーバー側で行われるため、混合コンテンツの問題はありません)。私の幸せなユーザーを豪華なありがとうページにリダイレクトします。


安全なバージョンのAPIをお持ちですか?安全なサイトをオリジンとして使用している場合は、HTTPS経由でリクエストする必要があります。
Cameron Tinker

1
いいえ、できません。他に方法はありますか?
つまり

ApacheでHTTPS URLを作成して、XX.XXX.XX.XXHTTP経由でプロキシすることができます。ただし、HTTPの目的がユーザーの情報を保護することである場合は、サーバー間のルートがパブリックインターネットを経由しないように注意する必要があります。
2015年

回答:


89

HTTPSを使用してブラウザにページをロードすると、ブラウザはHTTP経由でのリソースのロードを拒否します。試したように、API URLをHTTPではなくHTTPSに変更すると、通常この問題が解決します。ただし、APIはHTTPS接続を許可してはなりません。このため、メインページでHTTPを強制するか、HTTPS接続を許可するように要求する必要があります。

これに関する注意:AJAXを使用してロードするのではなく、API URLにアクセスしても、リクエストは機能します。これは、ブラウザがセキュリティで保護されたページ内からリソースを読み込んでいないためです。代わりに、セキュリティで保護されていないページを読み込んでそれを受け入れています。ただし、AJAXで利用できるようにするには、プロトコルが一致している必要があります。


1
はい、APIは私のサーバーにありますが、httpsにするためのガイドはありますか?
StormRage 2015年

1
@StormRage絶対に!どのタイプのサーバーを実行していますか?アパッチ?共有ホスティングですか、それともプライベートサーバーですか?
Mikel Bitson、2015年

@StormRageさらにサポートが必要な場合はお知らせください。そうでなければ、投票はあなたがここで得た公的支援の動機となります。
Mikel Bitson 2015年

1
これに遅れて申し訳ありません、私はAJAXを使用せずに解決することができました、私のソリューションにはいくつかのwordpress関数/ php curlが含まれています「自分の質問に答える」というボタンを使用する必要がありますか?
StormRage 2015年

1
ここで回答の関連部分を強調しました。これに対する唯一の実用的なソリューションは、HTTPSを使用することです
Liam

129

私たちが制御していないサードパーティのAPIを使用しているため、次のコードをHTMLページに追加することでこれを解決しました。

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> 

これが参考になることを願っています。


8
これによりhttp、使用するすべてのリクエストがアップグレードされるためhttps、呼び出しごとにプロトコルを変更する必要はありません。
18年

3
これは私のために働いたが、残念ながらこれは、Internet Explorerで動作しません:developer.mozilla.org/en-US/docs/Web/HTTP/Headers/...
シアラン・ギャラガー

2
私はこれを試しましたが、Firefoxとnet :: ERR_SSL_PROTOCOL_ERRORでChromeでCORSエラーが発生します。以前は自分のウェブページがhttpだったのですべての通話が機能することはわかっていますが、httpsに変更したため、これらの通話が機能しません。メインHTMLファイルに追加できる他に何かありますか?@Juanma Menendezの手順に従うと、すべての呼び出しが機能しますが、すべてのユーザーがこれを実行することは期待できません。
Otorrinolaringologista

私はあなたの答えが見つかるまで何時間もこの問題に取り組んできました。
Muhab

このソリューションが私たちのケースで機能することを確認しました。おそらく将来的にも役立つかもしれませんwww.example.com/blabla/master.m3u8。それはすべてhttpでうまくいきました。しかし、それをhttpsに移行しているときは機能しません。イニシャルmaster.m3u8httpsリクエストを実行できることがわかりましたが、次のセグメント化されたビデオのチャンクが常に使用されていましたhttp(サードパーティのモジュールを使用しているため)。何を調整しても、使用されませんhttps。このポリシーを使用して、すぐに魅力のように動作しました!
rahmatns

34

信頼できるWebページにアクセスしているだけで、すばやく前進したい場合は、次のようにします。

1-アドレスバーの右端にある盾アイコンをクリックします。

Google Chromeで混合コンテンツを許可する

2-ポップアップウィンドウで、[とにかく読み込む]または[安全でないスクリプトを読み込む]をクリックします(Chromeのバージョンによって異なります)。


Chromeブラウザーを常に(すべてのWebページで)に設定する場合は、混合コンテンツを許可します。

1-開いているChromeブラウザで、キーボードのCtrl + Shift + Qを押してChromeを強制終了します。次の手順の前にChromeを完全に閉じる必要があります。

2- Google Chromeデスクトップアイコン(または[スタートメニュー]リンク)を右クリックします。プロパティを選択します。

3- [Target]フィールドの既存の情報の最後に、「-allow-running-insecure-content」を追加します(最初のダッシュの前にスペースがあります)。

4- [OK]をクリックします。

5- Chromeを開き、以前にブロックされたコンテンツを起動してみます。これで動作するはずです。


4
これは、OPなど、ブラウザーでサイトを機能させるために設定を変更したくないユーザーのためにWebサイトを設計する人には何もしません。
スモールパンツ

12

このエラーの理由は非常に単純です。サーバーがHTTPSを介して実行されているのに、AJAXがHTTPを介して呼び出そうとしているため、サーバーがAJAXの呼び出しを拒否しています。これは、メインのHTMLファイルのheadタグ内に次の行を追加することで修正できます。

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> 

それはそれを許可しますが、要求はhttpsです
BG BRUNO

私の場合。サーバーのみのHTTPリクエスト。私はこれを試す<meta>は機能しません。ブラウザは、URLで要求エラーを示しています。
iHad 169

1

APIコードがnode.jsサーバーで実行されている場合は、ApacheやNGINXではなく、そこに注意を向ける必要があります。Mikelは正解です。APIURLをHTTPSに変更することが答えですが、APIがnode.jsサーバーを呼び出している場合は、HTTPS用に設定することをお勧めします。そしてもちろん、node.jsサーバーは未使用の任意のポートに置くことができ、ポート443である必要はありません。


APIはサードパーティだったので、httpsに設定する方法がありませんでした。ヒットしようとしたURLを見るとわかるように、APIはPHPでコード化されています
StormRage

@StormRageあなたの質問とMikelの答えが私の問題の解決につながったので、私の答えは実際にはあなたの状況に当てはまらないとしても、ここでそれを書き留めておきたいと思いました。
mcmacerson 2017

ええと、あなたとMikelは正しいです。最も合理的な解決策は、APIでsslを使用することですが、このコンテキストでは、サードパーティのAPIだったので、それを行うことができませんでした。レガシーサイトはデータをバックエンドに送信し、サーバー内のAPIにリクエストを送信する可能性があります。
StormRage 2017

私は同じエラーこの記事で言及しているので、私は、同じホスト上のPWAなどのサーバサイドとイオン性アプリケーションとしてlaravelでAPIを実装しstackoverflow.com/q/56157129/308578
サーベルtabatabaeeヤズディ

1

Ajax Postメソッドを使用する代わりに、要素とともに動的フォームを使用できます。ページがSSLでロードされ、送信されたソースが非SSLであっても機能します。

フォームの要素の値valueを設定する必要があります。

ターゲット属性が「_blank」を設定すると、実際には新しい動的フォームがブラウザの別のタブで非SSLモードとして開きます

var f = document.createElement('form');
f.action='http://XX.XXX.XX.XX/vicidial/non_agent_api.php';
f.method='POST';
//f.target='_blank';
//f.enctype="multipart/form-data"

var k=document.createElement('input');
k.type='hidden';k.name='CustomerID';
k.value='7299';
f.appendChild(k);



//var z=document.getElementById("FileNameId")
//z.setAttribute("name", "IDProof");
//z.setAttribute("id", "IDProof");
//f.appendChild(z);

document.body.appendChild(f);
f.submit()

私は実際にはAPIをヒットしたいのですが、getリクエストを作成してメソッドでそれを実行すると、実際にはフォームを送信することになりますが、APIからの応答の読み取りで立ち往生しています。AJAXまたはxmlhttprequestが唯一のオプションだと思います
Siddharth Choudhary

解決策:-)
BG BRUNO

シンプルですばらしい
Harkal

0

私は同じ問題でしたが、私にとっての問題はng buildコマンドでした。「ng build --prod」を実行していましたが、「ng build --prod --base-href / applicationname /」に修正しました。これで私の問題は解決しました。


0

私の場合、私のlocalhost httpと私のデプロイされたバージョンはhttpsだったので、このスクリプトを使用して、httpsにのみhttp-equivメタタグを追加しました。

if (window.location.protocol.indexOf('https') == 0){
  var el = document.createElement('meta')
  el.setAttribute('http-equiv', 'Content-Security-Policy')
  el.setAttribute('content', 'upgrade-insecure-requests')
  document.head.append(el)
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.