การเรียก AJAX ล้มเหลวโดยมีข้อผิดพลาด HTTP/HTTPS เนื้อหาผสม ไม่สามารถบังคับ HTTPS ได้

ฉันมี EC2 instance เดียวที่ทำงานอยู่เบื้องหลัง ELB ซึ่งฉันใช้ AWS Certificate Manager (ACM) เพื่อเปิดใช้งาน HTTPS

ตามที่แนะนำในบางที่ ฉันแมปทั้ง HTTP (พอร์ต 80) และ HTTPS (443) กับ HTTP (พอร์ต 80) ของอินสแตนซ์ของฉัน

ฉันยังเปิดใช้งานการบังคับใช้การเชื่อมต่อที่ปลอดภัยด้วยการเพิ่มบรรทัดเหล่านี้ลงในไฟล์ .htaccess:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

ทั้งหมดที่ทำงานอย่างสวยงาม ทุกหน้าแสดงเนื้อหาที่ปลอดภัยตามที่คาดไว้ โดยไม่มีคำเตือนในคอนโซลเกี่ยวกับเนื้อหาผสม

เฉพาะในหน้าเว็บที่ฉันโทร AJAX เท่านั้น ฉันพบข้อผิดพลาดเกี่ยวกับเนื้อหาผสมและเฉพาะใน Chrome เท่านั้น FireFox ทำงานตามที่คาดไว้ แต่คอนโซลยังคงแสดงข้อผิดพลาด

ข้อผิดพลาด (FireFox):

นโยบายความปลอดภัยของเนื้อหา: การอัปเกรดคำขอที่ไม่ปลอดภัย 'http://example.com/myapi/get_company/?code=abcd&limit=8' เพื่อใช้ 'https'

ข้อผิดพลาด (Chrome):

เนื้อหาผสม: หน้าที่ 'https://example.com/mypage' ถูกโหลดผ่าน HTTPS แต่ขอให้ จุดสิ้นสุด XMLHttpRequest ที่ไม่ปลอดภัย 'http://example.com/myapi/get_company/?code=abcd&limit=8'. คำขอนี้ถูกบล็อก เนื้อหาจะต้องให้บริการผ่าน HTTPS

ฉันเปิด chrome://net-internals/ และจากสิ่งที่ฉันเห็น มีสองสายที่สายแรกได้รับ HTTP 301 Permanent Redirect และสายที่สองล้มเหลวเนื่องจากการเปลี่ยนเส้นทางชี้ไปที่หน้า HTTP ไม่ใช่ HTTPS

การโทร AJAX มีลักษณะดังนี้:

$url = "/myapi/get_company?code=" + e;
apiJson = $.ajax({
    url: $url, 
    dataType: 'json',
    data:{
        limit:8
    },
success: function(data) { //Some code here },
error: function(jqXHR, textStatus, errorThrown) { //Some code here }
});

ฉันยังพยายามให้ URL แบบเต็มรวมถึงโปรโตคอลด้วย แต่ก็ไม่ได้สร้างความแตกต่าง


person Insider Pro    schedule 19.05.2016    source แหล่งที่มา
comment
เหตุใดคุณจึงต้องมีเงื่อนไข RewriteCond %{HTTPS} !=on   -  person Shibashis    schedule 19.05.2016


คำตอบ (3)


อัปเดตการกำหนดค่า .htaccess

RewriteCond %{HTTPS} !=on --> ไม่จำเป็น

อัปเดตการกำหนดค่าไฟล์ .htaccess เป็น

RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

นอกเหนือจากการเปลี่ยนไฟล์ .htaccess แล้ว คุณต้องแน่ใจด้วยว่า เมื่อเพจโหลดโดยใช้รูปแบบ HTTPS การเรียก ajax ที่สร้างจากเพจนั้นไม่ควรอยู่บน HTTP ข้อผิดพลาดที่คุณเห็นคือข้อผิดพลาดของเบราว์เซอร์ และแยกออกจากวิธีการกำหนดค่า elb ของคุณ

person Shibashis    schedule 19.05.2016
comment
น่าเสียดายที่สิ่งนี้ไม่ได้ช่วยอะไร มันไม่ได้สร้างความแตกต่างเลย อันที่จริง ฉันได้ลองลบทั้ง 3 บรรทัดออกด้วย และนั่นก็ไม่ได้สร้างความแตกต่างหากหน้าปัจจุบันแสดงอยู่ใน HTTPS แล้ว หากหน้าปัจจุบันแสดงใน HTTP และบรรทัดถูกลบ แสดงว่าทุกอย่างทำงานได้อย่างถูกต้อง ฉันไม่คิดว่าปัญหาจะอยู่ที่ JavaScript ฉันเชื่อว่าเกี่ยวข้องกับการกำหนดค่า ELB และวิธีกำหนดเส้นทางการรับส่งข้อมูลไปยัง EC2 ฉันไม่รู้ว่าจะเข้าใกล้สิ่งนี้อย่างไร - person Insider Pro; 19.05.2016
comment
เป็นโครงร่างฮาร์ดโค้ดของแอปของคุณในไฟล์ js .. ควรสร้างแบบไดนามิกโดยใช้โครงร่างขาเข้าไปยังเซิร์ฟเวอร์ - person Shibashis; 19.05.2016
comment
ขออภัย ฉันไม่แน่ใจเหมือนกันว่าคุณหมายถึงอะไรตามแผนงาน ทุกอย่างทำงานได้ดีหากฉันไม่บังคับใช้ HTTPS - person Insider Pro; 19.05.2016
comment
เมื่อเพจโหลดบน HTTPS แล้ว คำขอ Ajax ไม่ควรส่งคำขอไปยัง HTTP.. ไม่ว่าคุณจะเปลี่ยนจากเบราว์เซอร์ HTTPS เป็น HTTP ใดก็ตามจะมีข้อผิดพลาดดังกล่าว - person Shibashis; 19.05.2016
comment
ขอบคุณสำหรับความช่วยเหลือในเรื่องนี้ ฉันเข้าใจแล้วว่าปัญหาคืออะไร ดูคำตอบของฉันหากคุณสงสัย - person Insider Pro; 20.05.2016

ฉันพบวิธีแก้ไขแล้วและตอนนี้ก็โพสต์คำตอบสำหรับคำถามของฉันเอง อย่าถามฉันว่าฉันคิดเรื่องนี้ได้อย่างไร เพราะฉันไม่สามารถให้คำตอบที่ชัดเจนแก่คุณได้ แต่นี่คือสิ่งที่ทำ:

$url = "/myapi/get_company?code=" + e;

เปลี่ยนไปเป็น:

$url = "/myapi/get_company/?code=" + e;

สังเกตเครื่องหมายทับต่อท้าย ก่อนพารามิเตอร์ ไฟล์จริงที่จัดการการโทร AJAX บนฝั่งเซิร์ฟเวอร์อยู่ที่นี่:

/myapi/get_company/index.php
person Insider Pro    schedule 20.05.2016

ตรวจสอบว่าปัญหาอยู่ที่เซิร์ฟเวอร์ ไม่ใช่ที่ไคลเอ็นต์ การเรียก AJAX ของคุณคือไปยังจุดสิ้นสุด API จุดสิ้นสุด API นั้นส่งคืนการเปลี่ยนเส้นทาง HTTP เมื่อควรส่งคืนการเปลี่ยนเส้นทาง HTTPS หรือไม่

person Josh    schedule 05.05.2017