Bir HTTPS sayfasında HTTP AJAX işlemi çalıştırırken "karma içerik engellendi"


111

(Bu şekilde gerekli olduğu için GET aracılığıyla) bir crm'ye (ViciDial) gönderdiğim bir formum var. Formu başarılı bir şekilde gönderebilirim, ancak bunu yaparsam crm'deki işleme dosyası sadece bir başarı metnini yansıtır ve bu kadar.

Bu metin yerine web sitemde bir teşekkür sayfası görüntülemek istiyorum, bu yüzden formu göndermek ve ihtiyacım olan sayfaya yönlendirmek için AJAX kullanmaya karar verdim, ancak tarayıcımda şu hatayı alıyorum:

Karışık İçerik: ' https://page.com ' adresindeki sayfa HTTPS üzerinden yüklendi, ancak güvenli olmayan bir XMLHttpRequest uç noktası ' http://XX.XXX.XX.XXX/vicidial/non_agent_api.php?queries=query=data '. Bu istek engellendi; içerik HTTPS üzerinden sunulmalıdır.

Bu benim AJAX komut dosyam:

    <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>

Sadece URL'de https ayarlamak işe yaramaz, verileri GET aracılığıyla göndermenin ve kullanıcıyı teşekkür sayfama yönlendirmenin herhangi bir yolu var mı?

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

Buradaki sorun karışık içerikti, bu, HTTPS aracılığıyla bir sayfa yüklediğim ve AJAX aracılığıyla HTTP'de bulunan bir API'ye ulaşmaya çalıştığım anlamına geliyor. Ancak tarayıcı bunu yapmamıza izin vermiyor.

Dolayısıyla, API'yi HTTPS olarak ayarlayamazsanız (bu benim durumumdu) buna hala farklı bir şekilde yaklaşabiliriz.

Ana Sorun karışık içerik sorunu değildi, verileri bir API'ye göndermek ve kullanıcıları şık bir teşekkür sayfasına yönlendirmek istememdi. AJAX kullanmak yerine, veriyi alan ve curl kullanarak API'ye gönderen bir php dosyası yaptım (bu işlem sunucu tarafında yapıldığından karışık içerik sorunu yok) ve mutlu kullanıcımı süslü bir teşekkür sayfasına yönlendiriyor.


API'nizin güvenli bir sürümüne sahip misiniz? Kaynak olarak güvenli bir site kullanıyorsanız HTTPS üzerinden talepte bulunmanız gerekir.
Cameron Tinker

1
Hayır yok, bunu yapmanın başka bir yolu var mı? Demek istediğim, sadece Ajax olmadan gönderme formunu kullanırsanız istek yerine
getirilir

XX.XXX.XX.XXHTTP üzerinden proxy yapmak için Apache'de bir HTTPS URL'si oluşturabilirsiniz . Bununla birlikte, HTTP'nin amacı kullanıcının bilgilerini korumaksa, sunucular arasındaki yolun genel internet üzerinden geçmemesine dikkat etmeniz gerekecektir.
halfer

Yanıtlar:


93

Tarayıcınıza HTTPS kullanarak bir sayfa yüklerseniz, tarayıcı HTTP üzerinden herhangi bir kaynak yüklemeyi reddeder. Denediğiniz gibi, API URL'sini HTTP yerine HTTPS'ye sahip olacak şekilde değiştirmek genellikle bu sorunu çözer . Ancak, API'niz HTTPS bağlantılarına izin vermemelidir. Bu nedenle, ana sayfada HTTP'yi zorlamanız veya HTTPS bağlantılarına izin vermelerini istemeniz gerekir.

Bununla ilgili not: İstek, AJAX ile yüklemeyi denemek yerine API URL'sine giderseniz yine de çalışacaktır. Bunun nedeni, tarayıcının güvenli bir sayfadan kaynak yüklememesi, bunun yerine güvenli olmayan bir sayfa yüklemesi ve bunu kabul etmesidir. AJAX aracılığıyla kullanılabilmesi için protokollerin aynı olması gerekir.


1
Tamam, API sunucumda, https yapmak için takip edebileceğim herhangi bir rehber var mı?
Stormrage

1
@StormRage Kesinlikle! Ne tür bir sunucu çalıştırıyorsunuz? Apaçi? Paylaşılan barındırma mı yoksa özel bir sunucu mu?
Mikel Bitson

@StormRage Daha fazla yardıma ihtiyacınız olursa lütfen bana bildirin. Aksi takdirde, oylama, burada SO'da alacağınız kamu yardımını teşvik edecektir.
Mikel Bitson

1
Bu konuda geç kaldığım için üzgünüm, AJAX kullanmadan çözmeyi başardım, çözümlerim bazı wordpress fonksiyonları / php curl içeriyor, çözümümü olabildiğince çabuk göndermem, sadece sorumu düzenleyip çözümümü ona yazmam gerekir mi? "kendi sorunuzu cevaplayın" yazan düğmeyi kullanmalı mıyım?
Stormrage

1
Cevabın ilgili kısmı burada vurgulandı. Bunun için tek pratik çözüm HTTPS kullanmaktır
Liam

132

Tarafımızdan kontrol edilmeyen üçüncü parti API kullandığımız için HTML sayfasına aşağıdaki kodu ekleyerek bu sorunu çözdüm.

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

Umarım bu yardımcı olur ve bir rekor için.


8
Bu http, kullanılacak tüm istekleri yükseltir https, böylece her arama için protokolü değiştirmenize gerek kalmaz.
2018

3
Bu benim için çalıştı, ancak ne yazık ki bu Internet Explorer ile çalışmıyor: developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…
Ciaran Gallagher

2
Bunu denedim ama şimdi firefox'ta CORS hatası ve chrome'da net :: ERR_SSL_PROTOCOL_ERROR hatası alıyorum. Tüm aramaların işe yaradığını biliyorum çünkü web sayfam daha önce http idi, ancak şimdi https olarak değiştirdiğim için bu aramalar çalışmıyor. Ana html dosyama ekleyebileceğim başka bir şey var mı? Çünkü @Juanma Menendez adımlarını takip edersem tüm aramalar çalışır ancak her kullanıcının bunu yapmasını bekleyemem.
Otorrinolaringologista

Cevabınızı bulana kadar saatlerdir bu sorunla uğraşıyorum, çok teşekkürler!
Muhab

Bu çözümün bizim durumumuzda çalıştığını onaylıyoruz, belki gelecekte size de yardımcı olabilir: Segmentli bir HTTP canlı akış / talep üzerine video özelliği oluşturmaya çalıştık, gibi bir şey www.example.com/blabla/master.m3u8. Her şey http üzerinde güzel çalıştı. Ancak onu https'ye taşıdığımızda işe yaramayacak. Başlangıcın istekte master.m3u8bulunabildiğini öğrendik https, ancak aşağıdaki bölümlere ayrılmış video parçası her zaman kullanıyordu http(çünkü üçüncü taraf modülü kullanıyoruz). Ne yaparsak yapalım, kullanmayacak https. Bu politikayı kullandı ve anında bir cazibe gibi çalıştı!
rahmatns

34

Sadece güvendiğiniz bir web sayfasını ziyaret ediyorsanız ve hızlı ilerlemek istiyorsanız, sadece:

1- Adres çubuğunun en sağındaki kalkan simgesini tıklayın.

Google Chrome'da karma içeriğe izin verin

2- Açılan pencerede, "Yine de yükle" veya "Güvenli olmayan komut dosyası yükle" seçeneğini tıklayın (Chrome sürümünüze bağlı olarak).


Chrome tarayıcınızı HER ZAMAN (tüm web sayfalarında) karışık içeriğe izin verecek şekilde ayarlamak istiyorsanız:

1- Açık bir Chrome tarayıcıda, Chrome'u kapanmaya zorlamak için klavyenizdeki Ctrl + Shift + Q tuşlarına basın. Sonraki adımlardan önce Chrome tamamen kapatılmalıdır.

2- Google Chrome masaüstü simgesini (veya Başlat Menüsü bağlantısını) sağ tıklayın. Özellikler'i seçin.

3- Hedef alanındaki mevcut bilgilerin sonuna: "--allow-running-insecure-content" ekleyin (İlk tireden önce boşluk vardır.)

4- Tamam'a tıklayın.

5- Chrome'u açın ve daha önce engellenen içeriği başlatmayı deneyin. Şimdi çalışmalı.


4
Bu, sitenin tarayıcılarında çalışmasını sağlamak için ayarlarını değiştirmek istemeyen kullanıcılar için web siteleri tasarlayan insanlar için hiçbir şey yapmaz, örneğin OP.
smallpants

13

Bu hatanın nedeni çok basit. AJAX'ınız HTTP üzerinden çağrı yapmaya çalışırken sunucunuz HTTPS üzerinden çalıştığı için sunucunuz AJAX'ınızı çağırmayı reddediyor. Bu, ana HTML dosyanızın head etiketinin içine aşağıdaki satırı ekleyerek düzeltilebilir:

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

buna izin veriyor ancak istek https
BG BRUNO

Benim durumumda. sunucu yalnızca HTTP isteği. Bunu deniyorum <meta> çalışamaz. Tarayıcı, URL adresinde istek hatası olduğunu söylüyor.
iHad 169

1

API kodunuz bir node.js sunucusunda çalışıyorsa, dikkatinizi Apache veya NGINX'e değil, oraya odaklamanız gerekir. Mikel haklı, API URL'sini HTTPS olarak değiştirmek cevaptır, ancak API'niz bir node.js sunucusunu çağırıyorsa, HTTPS için ayarlanması daha iyidir! Ve tabii ki, node.js sunucusu kullanılmayan herhangi bir bağlantı noktasında olabilir, 443 numaralı bağlantı noktası olması gerekmez.


API üçüncü taraftı, bu yüzden onu https olarak ayarlayabilmemin bir yolu yoktu ve vurmaya çalıştığım url'de de görebileceğiniz gibi, API PHP'de kodlanmıştı
StormRage

@StormRage Sorunuz ve Mikel'in cevabı sorunum için bir çözüme yol açtı, bu yüzden cevabım sizin durumunuz için geçerli olmasa da burada not alacağımı düşündüm.
mcmacerson

Pekala, sen ve Mikel haklısınız, en makul çözüm API'de ssl kullanmak olacaktır, ancak bu bağlamda bunu bir 3. parti API olduğu için yapamadım, ancak wordpress veya ppl için bir çözüm herhangi bir eski site, verileri arka uçlarına gönderiyor ve isteği sunucu içindeki API'ye gönderiyor olabilir.
Stormrage

API'yi laravel tarafından sunucu tarafı olarak ve aynı ana bilgisayarda PWA olarak iyonik uygulama olarak uyguladım, bu nedenle bu makalede bahsedilen aynı hatayı
görüyorum

1

Ajax Post yöntemini kullanmak yerine eleman ile birlikte dinamik formu kullanabilirsiniz. Sayfa SSL olarak yüklense ve gönderilen kaynak SSL olmasa bile çalışır.

Form öğesinin değer değerini ayarlamanız gerekir.

Aslında yeni dinamik form, hedef özellik "_blank" olarak ayarlandığında, Tarayıcının ayrı sekmesinde SSL olmayan mod olarak açılacaktır

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()

Aslında bir API'ye ulaşmak istiyorum, ancak bunu yönteminizle bir alma talebinde bulunarak yaptığımda, aslında bir form gönderiyor olurdum ama şimdi yanıtı API'den geri okumak zorunda kalıyorum. Sanırım AJAX veya xmlhttprequest tek seçenek
Siddharth Choudhary

araya giren çözüm :-)
BG BRUNO

basit ve parlak
Harkal

0

Ben de aynı sorundu, ama benim için sorun inşa komutuydu. "Ng build --prod" yapıyordum bunu "ng build --prod --base-href / applicationname /" olarak düzelttim. ve bu benim sorunumu çözdü.


0

benim durumumda, localhost'um httpve dağıtılmış sürümüm öyleydi https, bu yüzden bu komut dosyasını yalnızca https için http-equiv meta etiketi eklemek için kullandım:

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)
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.