ตรวจจับ HTTP หรือ HTTPS จากนั้นบังคับใช้ HTTPS ใน JavaScript


298

มีวิธีใดในการตรวจหา HTTP หรือ HTTPS จากนั้นบังคับใช้การใช้ HTTPS ด้วย JavaScript หรือไม่

ฉันมีรหัสบางอย่างสำหรับการตรวจสอบ HTTP หรือ HTTPS https:แต่ฉันไม่สามารถบังคับให้ใช้

ฉันกำลังใช้คุณสมบัติwindow.location.protocolเพื่อตั้งค่าสิ่งที่ไซต์นั้นจะhttps:รีเฟรชหน้าเว็บเพื่อหวังโหลด URL https'ed ใหม่ที่โหลดเข้าสู่เบราว์เซอร์

if (window.location.protocol != "https:") {
   window.location.protocol = "https:";
   window.location.reload();
}

15
นี่คือการจัดการด้านเซิร์ฟเวอร์ที่เชื่อถือได้ (และมีประสิทธิภาพ) มากกว่า
เควนติน

3
ฉันคิดว่าคุณถูก. ในฐานะผู้โจมตีที่ใช้การโจมตี MITM ฉันสามารถลบรหัสนี้ได้ ดังนั้นจึงมีเพียงการป้องกันการโจมตีด้วยกุญแจ
ndevln


1
@NeoDevlin ผู้โจมตี MITM บน http สามารถแทนที่การเปลี่ยนเส้นทางฝั่งเซิร์ฟเวอร์ได้เช่นกัน
Alex Lehmann

1
เผง ในปี 2018 ไม่มีข้อแก้ตัวใด ๆ ที่จะไม่ใช้ HSTS นี่เป็นวิธีเดียวที่ปลอดภัยในการบังคับใช้ HTTPS

คำตอบ:


500

ลองสิ่งนี้

if (location.protocol !== 'https:') {
    location.replace(`https:${location.href.substring(location.protocol.length)}`);
}

location.href = blahเพิ่มการเปลี่ยนเส้นทางนี้ไปยังประวัติเบราว์เซอร์ หากผู้ใช้กดปุ่มย้อนกลับผู้ใช้จะถูกเปลี่ยนเส้นทางกลับไปที่หน้าเดียวกัน เป็นการดีกว่าที่จะใช้location.replaceเนื่องจากไม่เพิ่มการเปลี่ยนเส้นทางนี้ไปยังประวัติเบราว์เซอร์


3
ทำไมwindowไม่document?
webjay


11
การเปรียบเทียบสตริงควรเป็น!==อย่างไร
Wes Turner

5
@WesTurner มันไม่สำคัญหรอก พวกเขาทั้งสองจะเป็นสตริงเสมอ หากมีหมายเลขหรือบูลีนก็อาจสร้างความแตกต่าง
Soumya

15
location.replace(url)จะดีกว่าlocation.href = urlในกรณีนี้มาก คุณไม่ต้องการให้มีการเปลี่ยนเส้นทางนี้ในประวัติของเบราว์เซอร์หรือผู้ใช้กดปุ่มย้อนกลับเพื่อรับการเปลี่ยนเส้นทางอีกครั้ง
Francisco Zarabozo

59

การตั้งค่านำทาง location.protocol ไปยัง URL ไม่จำเป็นต้องแยกวิเคราะห์ / ชิ้นใด ๆ

if (location.protocol !== "https:") {
  location.protocol = "https:";
}

Firefox 49 มีข้อผิดพลาดที่httpsทำงาน แต่https:ไม่ได้ บอกว่าจะได้รับการแก้ไขใน Firefox 54


2
if window.location.href.match('http:') window.location.href = window.location.href.replace('http', 'https')ใช้งานได้กับ FF และ Chrome ล่าสุด
Martin Stannard

2
location.protocol = "https";ดูเหมือนว่าจะทำงานแม้ว่าใน firefox 28
Nick Russler

1
อึที่แบ่งปุ่มย้อนกลับ ใช้location.replaceแทน
Chimpanzee

22

มันไม่ได้เป็นความคิดที่ดีเพราะคุณเพียงแค่ชั่วคราวผู้ใช้เปลี่ยนเส้นทางไปที่ https และเบราว์เซอร์ไม่ได้บันทึกการเปลี่ยนเส้นทางนี้

คุณอธิบายงานสำหรับเว็บเซิร์ฟเวอร์ (apache, nginx ฯลฯ ) http 301, http 302


3
ตกลง. บังคับให้ https บนเซิร์ฟเวอร์อยู่ไกลน่าเชื่อถือมากขึ้น
Hoàngยาว

3
ฉันสามารถเห็นมันถูกใช้ถ้ารักษาค่าแฮเป็นสิ่งสำคัญ มันไม่ได้ถูกส่งไปยังเซิร์ฟเวอร์และเบราว์เซอร์บางตัวไม่เก็บรักษาไว้
Jason Rice

นี่คือลิงค์สำหรับตั้งค่าเว็บไซต์ Azure สำหรับ https เท่านั้น ... blogs.msdn.com/b/benjaminperkins/archive/2014/01/07/…
OzBob

1
ไม่จำเป็นต้องเป็นเรื่องจริง มีโรงเรียนแห่งความคิดที่ว่า 301 เป็นมารสำหรับแคชเหตุผล getluky.net/2010/12/14/301-redirects-cannot-be-undon
fivedogit

2
แม้ว่าจะเป็นความจริงที่โดยทั่วไปแล้วไม่ใช่ความคิดที่ดีที่จะทำสิ่งนี้กับลูกค้า แต่นี่ไม่ใช่สิ่งที่ถูกถาม และคุณไม่ได้แสดงวิธีการทำดังนั้นจึงไม่ใช่คำตอบ นอกจากนี้ในหน้าเว็บแบบสแตติกเหล่านี้มักจะไม่มีวิธีทำฝั่งเซิร์ฟเวอร์นี้ (คิดว่าหน้า Github) หมายความว่าคุณต้องทำสิ่งนี้กับลูกค้า ถึงกระนั้นคุณสามารถช่วยปรับปรุงการค้นหาโดยเพิ่มแท็กลิงก์แบบบัญญัติเพื่อหลีกเลี่ยงคนที่ตีเวอร์ชันที่ไม่ใช่ ssl
oligofren

16

แล้วเรื่องนี้ล่ะ

if (window.location.protocol !== 'https:') {
    window.location = 'https://' + window.location.hostname + window.location.pathname + window.location.hash;
}

เป็นการดีที่คุณจะทำมันในฝั่งเซิร์ฟเวอร์แม้ว่า


มันหายไปพอร์ต
eadmaster


5

ไม่ใช่วิธี Javascript ที่จะตอบคำถามนี้ แต่ถ้าคุณใช้ CloudFlare คุณสามารถเขียนกฎของหน้าเว็บที่เปลี่ยนเส้นทางผู้ใช้ไปยัง HTTPS ได้เร็วขึ้นและฟรี ดูเหมือนว่าในกฎหน้าของ CloudFlare:

ป้อนคำอธิบายรูปภาพที่นี่


จริง ๆ แล้วฉันพบว่ามีประโยชน์มากไม่ตอบคำถามเป็นกรอบ แต่สำหรับการให้ข้อมูลที่เป็นประโยชน์เกี่ยวกับวิธีที่เชื่อถือได้มากขึ้นสำหรับบริการ SaaS ที่ไม่ได้ให้ SSL ตลอดเวลา
MrMesees

3

คุณทำได้:

  <script type="text/javascript">        
        if (window.location.protocol != "https:") {
           window.location.protocol = "https";
        }
    </script>

มันได้ผล. มันเป็นวิธีมาตรฐานในการเปลี่ยนเส้นทางหรือไม่? จะใช้งานได้กับเบราว์เซอร์ทั้งหมดหรือไม่
Mahfuz



0

ฉันชอบคำตอบสำหรับคำถามนี้ แต่เพื่อความคิดสร้างสรรค์ฉันต้องการแบ่งปันอีกหนึ่งวิธี:

<script>if (document.URL.substring(0,5) == "http:") {
            window.location.replace('https:' + document.URL.substring(5));
        }
</script>

-1
<script type="text/javascript">
        function showProtocall() {

            if (window.location.protocol != "https") {
                window.location = "https://" + window.location.href.substring(window.location.protocol.length, window.location.href.length);
                window.location.reload();
            }
        }
        showProtocall();
</script>

-1

สวัสดีฉันใช้โซลูชันนี้ทำงานอย่างสมบูรณ์แบบไม่จำเป็นต้องตรวจสอบเพียงใช้ https

<script language="javascript" type="text/javascript">
document.location="https:" + window.location.href.substring(window.location.protocol.length, window.location.href.length);
</script>

3
สิ่งนี้จะรีเฟรชหน้าเว็บแม้ว่าโปรโตคอลจะเป็น https หรือไม่
แอนโธนี

-2

ฉันเพิ่งมีรูปแบบสคริปต์ทั้งหมดที่ทดสอบโดยPui Cdmรวมคำตอบข้างต้นและอื่น ๆ อีกมากมายโดยใช้ php, htaccess, การกำหนดค่าเซิร์ฟเวอร์และ Javascript ผลลัพธ์คือสคริปต์

<script type="text/javascript">        
function showProtocall() {
        if (window.location.protocol != "https") {
            window.location = "https://" + window.location.href.substring(window.location.protocol.length, window.location.href.length);
            window.location.reload();
        }
    }
    showProtocall();
</script> 

จัดทำโดยvivek-srivastava ทำงานได้ดีที่สุดและคุณสามารถเพิ่มความปลอดภัยเพิ่มเติมในจาวาสคริปต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.