Cara Membuat Permintaan AJAX HTTPS GET Menggunakan jQuery

Bagaimana saya bisa secara eksplisit membuat permintaan AJAX HTTPS GET menggunakan jQuery? Saya mencoba melakukan hal berikut. Di halaman https saya memiliki baris dengan kode $.get("/resource") tetapi saya mendapatkan kesalahan berikut

XMLHttpRequest cannot load http://www.site.com/resource. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://www.site.com' is therefore not allowed access.

Mengapa panggilan AJAX mencoba mengakses halaman menggunakan protokol HTTP jika sumber daya relatif berasal dari halaman https? Jika metode $.get(url) melakukan ini secara default, bagaimana cara menggunakan jQuery untuk melakukan permintaan HTTPS GET eksplisit? Orang lain, yang mengalami masalah serupa, di http://forum.jquery.com/topic/jquery-get-ajax-call-on-http-page-to-https-on-same-domain tidak dapat menyelesaikannya.

Versi jQuery adalah 1.7.2


person FearlessFuture    schedule 11.01.2014    source sumber
comment
Lihat: stackoverflow.com/questions/15375908/   -  person klugerama    schedule 11.01.2014
comment
@FearlessFuture - Apakah Anda membuat GET dari domain yang sama?   -  person Aneesh Vijendran    schedule 11.01.2014
comment
Juga: stackoverflow.com/questions/7311702/   -  person klugerama    schedule 11.01.2014
comment
Mengapa tidak menggunakan URL absolut saja?   -  person klugerama    schedule 11.01.2014
comment
@avijendr, ya dari domain yang sama.   -  person FearlessFuture    schedule 11.01.2014


Jawaban (4)


Saya telah memperbaiki masalahnya. Ternyata karena cara situs Django kami dikonfigurasi, saya perlu menambahkan garis miring ke sumber daya dalam permintaan AJAX. Tanpa garis miring di akhir, Django kemudian akan mengarahkan ke URL dengan garis miring di akhir menggunakan permintaan HTTP alih-alih permintaan HTTPS.

Singkatnya, saya mengganti $.get("/resource") dengan $.get("/resource/").

Terima kasih. Saya sangat menghargai semua bantuan Anda.

person FearlessFuture    schedule 17.01.2014
comment
Ini sangat membantu! Bagi siapa pun yang bertanya-tanya tentang hal yang sama yang saya lakukan - ya, garis miring tidak akan memengaruhi parameter apa pun, yaitu. /resource/?param=1 akan bekerja dengan baik. Satu catatan lagi: ini lebih mudah untuk didiagnosis di Chromium, karena Chromium menampilkan dua permintaan (satu https, yang kedua https) sedangkan FireBug hanya menampilkan GET https://... bersama dengan header location: http://..., yang mungkin membingungkan. - person Protagonist; 09.09.2014
comment
Ini sepertinya bukan jawaban umum untuk masalah ini, tetapi hanya untuk lingkungan Django dengan konfigurasi rahasia Anda? Atau apakah menambahkan garis miring merupakan pengaturan jquery rahasia untuk https. - person Andrew; 15.07.2016
comment
Inti dari jawaban ini adalah jika url Anda sedikit salah, kemungkinan besar server Anda mengarahkan ulang secara otomatis... jadi periksa kembali url apa yang sebenarnya Anda minta, dan di mana Anda berakhir. - person Andrew; 15.07.2016
comment
Solusi ini berhasil untuk saya menggunakan Flask Blueprints. Pengalihan ke url dengan tambahan / adalah masalahnya - person migreva; 28.09.2016
comment
sial!!! Saya menghabiskan satu jam untuk men-debug ini. Mengapa JQuery ingin menggunakan HTTP daripada HTTPS jika ada akhiran / yang hilang di akhir URL. Ayo WTF! Berikut algoritme yang benar: jika ada 'S' di protokol (mis. https://) gunakan HTTPS, jika tidak ada 'S' di protokol (mis. http://) jangan gunakan HTTPS. - person Gianluca Ghettini; 15.02.2019

Jika halaman yang Anda buka adalah halaman https, dan halaman yang .get coba akses adalah http, maka itu tidak akan berfungsi karena asal yang sama. Namun, Anda bisa menulis sajax alih-alih menyerahkannya dengan .get :)

$.ajax({
    type: "GET", 
    url: "https://someurl"
});

Meskipun menurut saya adil, itu masih kurang dari javascript yang sebenarnya

person mituw16    schedule 11.01.2014
comment
Jawaban Anda tidak berfungsi jika domainnya berbeda! Lihat - stackoverflow.com/questions/15375908/ - person Aneesh Vijendran; 11.01.2014
comment
@avvijender, itu sudah pasti. OP tidak mengatakan mereka mencoba membuat permintaan lintas domain. - person mituw16; 11.01.2014
comment
Jika ini bukan permintaan lintas domain, itu berfungsi dan saya kira pertanyaan ini tidak akan ada di sini. Saya telah menggunakan 100 https ajax get/post tetapi dari domain yang sama! - person Aneesh Vijendran; 11.01.2014
comment
Seperti halnya saya. Namun, saya sering mengalami masalah https / http. Jika permintaan datang dari https, tetapi mencoba untuk menekan http pada domain yang sama, saya telah melihat ini terjadi. Suara negatif yang tidak adil... - person mituw16; 11.01.2014
comment
Ya, saya memilih lagi. Saya biasanya tidak suka memberi suara negatif! Itu hanya masalah perbedaan pendapat. - person Aneesh Vijendran; 11.01.2014
comment
@ mituw16, itulah masalah yang saya alami. Saya berada di halaman HTTPS dan melakukan permintaan GET ke sumber daya di situs yang sama, tetapi mencoba mengakses sumber daya di situs yang sama persis, tetapi dengan protokol HTTP. - person FearlessFuture; 11.01.2014
comment
@FearlessFuture Anda dapat mencoba apa yang saya jawab, atau meneruskan url absolut ke .get seperti yang disarankan klugerama. Keduanya seharusnya berfungsi - person mituw16; 11.01.2014
comment
@ mituw16, saya menerima kesalahan yang sama ketika saya menyetel URL ke /resource dan saat saya menyetel URL ke site.com/ sumber daya. - person FearlessFuture; 11.01.2014
comment
Coba tulis ajax daripada menggunakan .get - person mituw16; 11.01.2014
comment
@FearlessFuture - browser dan versi apa yang Anda gunakan? Apakah ini terjadi pada semua browser? Jika tidak, silakan coba browser lain dan beri tahu kami. - person Aneesh Vijendran; 11.01.2014
comment
Itu terjadi di IE9: (Tidak tahu versi pastinya) IE10: 10.0.9200.16686 Chrome: 31.0.1650.63 - person FearlessFuture; 11.01.2014
comment
@ mituw16, saya menggunakan $.ajax() alih-alih $.get() dalam komentar terbaru saya kepada Anda. - person FearlessFuture; 11.01.2014
comment
Bisakah Anda memposting kode Anda? Akan memberi kita gambaran yang lebih baik tentang apa yang sedang terjadi - person mituw16; 11.01.2014
comment
Sayangnya, saya tidak dapat memposting lebih dari baris yang diberikan dalam postingan, karena ini adalah perangkat lunak perusahaan. - person FearlessFuture; 11.01.2014

Coba atur tipe data ke "jsonp", itu membantu saya di masa lalu dengan permintaan lintas asal.

    $.ajax({
            url: "//www.site.com/resource"
            dataType: "jsonp",
            success: function(data) {
                $(".demo-card").html(data);
            }
    });
person alphapilgrim    schedule 18.08.2015
comment
dataType untuk mengetahui format data respons, tidak ada hubungannya dengan permintaan. Anda sedang mencari crossDomain. - person jurchiks; 11.05.2016

Cukup gunakan RewriteRule di file .htaccess Anda dengan protokol yang ditentukan, misalnya:

RewriteCond %{REQUEST_URI} .+[^/]$
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L,QSA]
person Alex S    schedule 29.05.2017