วิธีสร้างคำขอ AJAX HTTPS GET โดยใช้ jQuery

ฉันจะสร้างคำขอ AJAX HTTPS GET อย่างชัดเจนโดยใช้ jQuery ได้อย่างไร ฉันกำลังพยายามทำสิ่งต่อไปนี้ ในหน้า https ฉันมีบรรทัดที่มีรหัส $.get("/resource") แต่ฉันได้รับข้อผิดพลาดต่อไปนี้

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.

เหตุใดการโทร AJAX จึงพยายามเข้าถึงหน้าโดยใช้โปรโตคอล HTTP หากทรัพยากรที่เกี่ยวข้องมาจากหน้า https หากเมธอด $.get(url) ทำเช่นนี้ตามค่าเริ่มต้น ฉันจะใช้ jQuery เพื่อทำคำขอ HTTPS GET ที่ชัดเจนได้อย่างไร บุคคลอื่นที่มีปัญหาคล้ายกันที่ http://forum.jquery.com/topic/jquery-get-ajax-call-on-http-page-to-https-on-same-domain ไม่สามารถแก้ไขได้

jQuery เวอร์ชันคือ 1.7.2


person FearlessFuture    schedule 11.01.2014    source แหล่งที่มา
comment
ดู: stackoverflow.com/questions/15375908/   -  person klugerama    schedule 11.01.2014
comment
@FearlessFuture - คุณสร้าง GET จากโดเมนเดียวกันหรือไม่   -  person Aneesh Vijendran    schedule 11.01.2014
comment
นอกจากนี้: stackoverflow.com/questions/7311702/   -  person klugerama    schedule 11.01.2014
comment
ทำไมไม่ใช้ URL ที่สมบูรณ์ล่ะ   -  person klugerama    schedule 11.01.2014
comment
@avijendr ใช่มันมาจากโดเมนเดียวกัน   -  person FearlessFuture    schedule 11.01.2014


คำตอบ (4)


ฉันแก้ไขปัญหาแล้ว ปรากฎว่าเนื่องจากวิธีการกำหนดค่าไซต์ Django ของเรา ฉันจึงต้องเพิ่มเครื่องหมายสแลชต่อท้ายให้กับทรัพยากรในคำขอ AJAX หากไม่มีเครื่องหมายทับต่อท้าย Django จะเปลี่ยนเส้นทางไปยัง URL ด้วยเครื่องหมายทับต่อท้ายโดยใช้คำขอ HTTP แทนคำขอ HTTPS

กล่าวโดยสรุป ฉันแทนที่ $.get("/resource") ด้วย $.get("/resource/")

ขอบคุณ ฉันขอขอบคุณทุกความช่วยเหลือของคุณ

person FearlessFuture    schedule 17.01.2014
comment
สิ่งนี้มีประโยชน์อย่างยิ่ง! สำหรับใครก็ตามที่สงสัยในสิ่งเดียวกันที่ฉันทำ - ใช่แล้ว เครื่องหมายสแลชต่อท้ายจะไม่ส่งผลกระทบต่อพารามิเตอร์ใด ๆ เช่น /resource/?param=1 จะทำงานได้อย่างสมบูรณ์แบบ หมายเหตุอีกประการหนึ่ง: การวินิจฉัยบน Chromium นั้นง่ายกว่า เนื่องจาก Chromium แสดงคำขอสองรายการ (หนึ่ง https และ https ที่สอง) ในขณะที่ FireBug แสดงเฉพาะ GET https://... พร้อมกับส่วนหัว location: http://... ซึ่งอาจทำให้เกิดความสับสน - person Protagonist; 09.09.2014
comment
ดูเหมือนจะไม่ใช่คำตอบทั่วไปสำหรับปัญหานี้ แต่สำหรับสภาพแวดล้อม django ที่มีการกำหนดค่าลับของคุณเท่านั้น หรือกำลังเพิ่มเครื่องหมายทับต่อท้ายการตั้งค่า jquery ที่เป็นความลับสำหรับ https - person Andrew; 15.07.2016
comment
ประเด็นของคำตอบนี้คือ หาก URL ของคุณไม่ถูกต้องเล็กน้อย เซิร์ฟเวอร์ของคุณก็มีแนวโน้มที่จะเปลี่ยนเส้นทางอัตโนมัติ... ดังนั้นให้ตรวจสอบอีกครั้งว่าคุณต้องการ URL ใดจริง ๆ และปลายทางของคุณจะอยู่ที่ใด - person Andrew; 15.07.2016
comment
วิธีนี้ใช้ได้ผลสำหรับฉันโดยใช้ Flask Blueprints การเปลี่ยนเส้นทางไปยัง URL ที่มีส่วนท้าย / เป็นปัญหา - person migreva; 28.09.2016
comment
ว้าว!!! ฉันใช้เวลาหนึ่งชั่วโมงในการดีบัก bs นี้ เหตุใดในโลกที่ JQuery ต้องการใช้ HTTP แทน HTTPS หากมีส่วนท้าย / ที่ส่วนท้ายของ URL ขาดหายไป เอาล่ะ WTF! ต่อไปนี้เป็นอัลกอริทึมที่ถูกต้อง: หากมี "S" ในโปรโตคอล (เช่น https://) ให้ใช้ HTTPS หากไม่มี "S" ในโปรโตคอล (เช่น http://) อย่าใช้ HTTPS - person Gianluca Ghettini; 15.02.2019

หากเพจที่คุณเปิดอยู่เป็นเพจ https และเพจ .get พยายามเข้าถึงคือ http นั่นก็จะใช้งานไม่ได้เนื่องจากมีต้นกำเนิดเดียวกัน อย่างไรก็ตาม คุณสามารถเขียน ajax แทนการเขียนสั้นๆ ด้วย .get :)

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

แม้ว่าฉันจะถือว่ายุติธรรม แต่นั่นก็ยังไม่ใช่จาวาสคริปต์ที่แท้จริง

person mituw16    schedule 11.01.2014
comment
คำตอบของคุณใช้ไม่ได้หากเป็นโดเมนอื่น! ดู - stackoverflow.com/questions/15375908/ - person Aneesh Vijendran; 11.01.2014
comment
@avvijender นั่นคือการให้ OP ไม่ได้บอกว่าพวกเขากำลังพยายามส่งคำขอข้ามโดเมน - person mituw16; 11.01.2014
comment
หากไม่ใช่คำขอข้ามโดเมนก็ใช้งานได้และคำถามนี้จะไม่อยู่ที่นี่ฉันเดา ฉันใช้ https ajax get/post กว่า 100 รายการ แต่มาจากโดเมนเดียวกัน! - person Aneesh Vijendran; 11.01.2014
comment
เช่นเดียวกับฉัน อย่างไรก็ตาม มีหลายครั้งที่ฉันมีปัญหา https / http หากคำขอมาจาก https แต่พยายามเข้าถึง http บนโดเมนเดียวกัน ฉันเห็นว่าสิ่งนี้เกิดขึ้น การลงคะแนนที่ไม่ยุติธรรม... - person mituw16; 11.01.2014
comment
ฉันลงคะแนนอีกครั้ง โดยทั่วไปฉันไม่ชอบการลงคะแนนเสียง! มันเป็นเพียงเรื่องของความคิดเห็นที่แตกต่างกัน - person Aneesh Vijendran; 11.01.2014
comment
@ mituw16 นั่นคือปัญหาที่ฉันกำลังประสบอยู่ ฉันอยู่ในหน้า HTTPS และทำการร้องขอ GET ไปยังทรัพยากรบนไซต์เดียวกัน แต่พยายามเข้าถึงทรัพยากรบนไซต์เดียวกัน แต่ใช้โปรโตคอล HTTP - person FearlessFuture; 11.01.2014
comment
@FearlessFuture คุณสามารถลองสิ่งที่ฉันตอบหรือส่ง URL ที่แน่นอนไปที่ .get ตามที่ klugerama แนะนำ ควร ได้ผล - person mituw16; 11.01.2014
comment
@ mituw16 ฉันได้รับข้อผิดพลาดเดียวกันทั้งเมื่อฉันตั้งค่า URL เป็น /resource และเมื่อฉันตั้งค่า URL เป็น site.com/ ทรัพยากร - person FearlessFuture; 11.01.2014
comment
ลองเขียน ajax แทนการใช้ .get - person mituw16; 11.01.2014
comment
@FearlessFuture - คุณใช้เบราว์เซอร์และเวอร์ชันใด สิ่งนี้เกิดขึ้นกับเบราว์เซอร์ทั้งหมดหรือไม่ หากไม่เป็นเช่นนั้น โปรดลองใช้เบราว์เซอร์อื่นแล้วแจ้งให้เราทราบ - person Aneesh Vijendran; 11.01.2014
comment
มันเกิดขึ้นบน IE9: (ไม่ทราบรุ่นที่แน่นอน) IE10: 10.0.9200.16686 Chrome: 31.0.1650.63 - person FearlessFuture; 11.01.2014
comment
@ mituw16 ฉันใช้ $.ajax() แทน $.get() ในความคิดเห็นล่าสุดของฉันถึงคุณ - person FearlessFuture; 11.01.2014
comment
คุณช่วยโพสต์รหัสของคุณได้ไหม? จะช่วยให้เรามีความคิดที่ดีขึ้นเกี่ยวกับสิ่งที่เกิดขึ้น - person mituw16; 11.01.2014
comment
ขออภัย ฉันไม่สามารถโพสต์เกินบรรทัดที่ระบุในโพสต์ได้ เนื่องจากเป็นซอฟต์แวร์ของบริษัท - person FearlessFuture; 11.01.2014

ลองตั้งค่าประเภทข้อมูลเป็น "jsonp" ซึ่งเคยช่วยฉันในอดีตด้วยคำขอข้ามต้นทาง

    $.ajax({
            url: "//www.site.com/resource"
            dataType: "jsonp",
            success: function(data) {
                $(".demo-card").html(data);
            }
    });
person alphapilgrim    schedule 18.08.2015
comment
dataType ใช้สำหรับค้นหารูปแบบข้อมูลการตอบกลับ ไม่เกี่ยวข้องกับคำขอ คุณกำลังมองหา crossDomain - person jurchiks; 11.05.2016

เพียงใช้ RewriteRule ในไฟล์ .htaccess ของคุณด้วยโปรโตคอลที่ระบุ เช่น:

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