วิธีเปลี่ยนเส้นทางคำขอ HTTP ทั้งหมดไปยัง HTTPS


294

ฉันพยายามเปลี่ยนเส้นทางคำขอ HTTP ที่ไม่ปลอดภัยทั้งหมดบนเว็บไซต์ของฉัน (เช่นhttp://www.example.com) ไปยัง HTTPS ( https://www.example.com) ฉันใช้ PHP btw ฉันสามารถทำได้ใน. htaccess หรือไม่


1
คุณสามารถ (และควร) ทำสิ่งนี้ผ่านทางของคุณhttpdไม่ใช่กับ PHP
drudge

2
@jnpcl ในขณะที่ฉันเห็นด้วยกับโซลูชัน httpd จะดีกว่าโซลูชันที่ใช้ PHP ฉันไม่คิดว่าการเปลี่ยนเส้นทางที่เป็นระบบเป็นการปฏิบัติที่ดีโดยทั่วไป หากคุณต้องการเปลี่ยนเส้นทางผู้ใช้ไปยัง HTTPS ตลอดเวลาให้ส่งพวกเขาจาก "จุดเข้าใช้งาน" (ลิงก์แรกไปยังเว็บไซต์ของคุณ) อย่าทำครึ่งทางผ่านซึ่งอาจทำให้ข้อมูลบางอย่างที่คุณคิดว่ารั่วไหล ได้รับการคุ้มครอง (ถ้าคุณไม่สังเกตเห็นว่าการเปลี่ยนเส้นทางทันที)
Bruno

@Bruno: ฉันคิดมากยิ่งขึ้นตามคำขอ HTTP ที่ซ้ำซ้อนโอกาสของสตริงการสืบค้นที่หายไปและความเป็นไปได้ที่ผู้ใช้งานพิมพ์ด้วยตัวเองhttp://
drudge

@jnpcl นั่นเป็นจุดที่ดีอย่างแน่นอน ฉันแค่แนะนำว่าในขณะที่คนมักจะขอเปลี่ยนเส้นทางประเภทนี้เพื่อปรับปรุงความปลอดภัยของเว็บไซต์ของพวกเขาบ่อยครั้งมันไม่ได้ปรับปรุงจริง (เนื่องจากไม่ป้องกันคำขอเดียวกันที่จะผ่าน HTTP ธรรมดาก่อน) .
บรูโน

8
@outis: ลิงค์แรกคุณโพสต์นี้คำถาม
เหม่ย

คำตอบ:


305

อัปเดต:แม้ว่าคำตอบนี้จะได้รับการยอมรับเมื่อไม่กี่ปีที่ผ่านมา แต่โปรดทราบว่าขณะนี้เอกสารแนะนำ Apache ได้ให้แนวทางการใช้งานแล้ว ใช้Redirectแทน ดูคำตอบนี้


RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

24
@Cat ตามที่ฉันพูดในคำตอบ / ความคิดเห็นของฉันหากคุณพยายามที่จะ "เปลี่ยนเส้นทาง HTTP ที่ไม่ปลอดภัยทั้งหมด [... ] ไปยัง HTTPS" วิธีการนี้จะไม่ทำให้คำขอเหล่านั้นปลอดภัย สองครั้งไม่ปลอดภัยและปลอดภัยครั้งเดียว
บรูโน

13
สิ่งที่คุณควรทำจริงๆคือใช้HSTSร่วมกับสิ่งนี้
รีสมัวร์

3
นี่อาจเป็นข้อผิดพลาดใน apache เวอร์ชันของฉัน (2.4.6 ตามที่บรรจุใน Centos 7) แต่สิ่งนี้มีปัญหาสำหรับฉันในบาง URL ยกตัวอย่างเช่นการhttp://server/foo?email=someone%40example.comเปลี่ยนเส้นทางไปhttps://server/foo?email=someone%2540example.comคือเครื่องหมาย "@" ได้รับ URL ที่ยกมาสองครั้ง การใช้วิธีการในคำตอบของ @ ssc ไม่มีปัญหานี้
psmears

2
คำตอบที่ไม่ถูกต้อง. มันจะเปลี่ยนเส้นทาง URL ฐานไม่ใช่ URL ในโฟลเดอร์ย่อย RewriteRule (. *) https: //% {HTTP_HOST}% {REQUEST_URI} [R = 301, L] คือคำตอบที่ถูกต้อง
FredTheWebGuy

7
พวกเขาไม่จำเป็นต้องแนะนำกับมัน:In the case of the http-to-https redirection, the use of RewriteRule would be appropriate if you don't have access to the main server configuration file, and are obliged to perform this task in a .htaccess file instead.
อดัม

338

เอกสาร Apacheแนะนำต่อโดยใช้เขียนใหม่:

หากต้องการเปลี่ยนเส้นทางhttpURL ไปที่ให้httpsทำดังต่อไปนี้:

<VirtualHost *:80>
    ServerName www.example.com
    Redirect / https://www.example.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

ข้อมูลโค้ดนี้ควรเข้าสู่ไฟล์กำหนดค่าเซิร์ฟเวอร์หลักไม่ใช่เข้าไป.htaccessตามที่ถามในคำถาม

บทความนี้อาจเกิดขึ้นหลังจากมีการถามและตอบคำถามแล้ว แต่ดูเหมือนจะเป็นวิธีการในปัจจุบัน


11
นี่ควรเป็นคำตอบปัจจุบัน แต่สิ่งที่ไปใน "การกำหนดค่า SSL" คืออะไร? ตัวอย่างที่สมบูรณ์จะเป็นประโยชน์จริงๆ
Ben

6
@Ben: นั่นเป็นคำถามที่แตกต่างกันซึ่งเป็นเอกสารออนไลน์อย่างกว้างขวาง บังเอิญฉันเพิ่งเพิ่มตัวอย่างเกือบเต็มรูปแบบเมื่อวานนี้: serverfault.com/q/597012/26210ซึ่งอาจให้ความคิดของสิ่งที่จะไปในการกำหนดค่า SSL ที่
SSC

46
นี่เป็นคำใบ้ที่ยอดเยี่ยม แต่ที่Apache docยังกล่าวถึง: "ในกรณีของการเปลี่ยนเส้นทาง http-to-https การใช้ RewriteRule จะเหมาะสมถ้าคุณไม่มีสิทธิ์เข้าถึงไฟล์การกำหนดค่าเซิร์ฟเวอร์หลักและจำเป็นต้องทำงานนี้ใน ไฟล์. htaccess แทน " ซึ่งเป็นกรณีสำหรับฉัน ...
peter_the_oak

4
@ user1844933 หากคุณใช้permanentคำหลักผลจะเหมือนกัน (เบราว์เซอร์จะได้รับการเปลี่ยนเส้นทาง 301) เช่น:Redirect permanent "/" "https://example.com"
BeetleJuice

2
@Whitecat ใน Centos 6 ไฟล์จะอยู่ที่ /etc/httpd/conf/httpd.conf
dstonek

141

ฉันขอแนะนำให้เปลี่ยนเส้นทาง 301:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

7
ขอบคุณมันใช้งานได้สำหรับฉันคำตอบที่ยอมรับไม่ได้ .. อาจเป็นเพราะการขาด[L]
billynoah

1
อ๋อ นี่เป็นคำตอบที่ถูกต้องเพราะมันกำหนดเส้นทาง URL ทั้งหมดในโฟลเดอร์ย่อยด้วย
FredTheWebGuy

นี่เป็นระดับสูงสุดของไฟล์ htaccess หรือไม่
CodyBugstein

1
@CodyBugstein นั่นคือสิ่งที่ฉันมักจะวางไว้และใช้งานได้เสมอ
Daan van den Bergh

3
คำตอบทั้งหมดขาดสิ่งเดียว - รหัสใด ๆ สำหรับการเปลี่ยนเส้นทางจะต้องถูกวางไว้ที่จุดเริ่มต้นของไฟล์. htaccess ของคุณก่อนสิ่งอื่นใดหากคุณต้องการให้หน้าทั้งหมดถูกเปลี่ยนเส้นทางไปยัง https
Vadim Anisimov

35

ตามที่ฉันพูดในคำถามนี้ฉันขอแนะนำให้คุณหลีกเลี่ยงการเปลี่ยนเส้นทางคำขอ HTTP ทั้งหมดไปยัง HTTPS ที่เทียบเท่ากับสุ่มสี่สุ่มห้าเพราะอาจทำให้คุณรู้สึกถึงความปลอดภัยผิดพลาด แต่คุณควรเปลี่ยนเส้นทาง "รูท" ของไซต์ HTTP ของคุณไปยังรูทของไซต์ HTTPS และลิงก์จากที่นั่นไปยัง HTTPS เท่านั้น

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

ตัวอย่างเช่นหากหนึ่งในหน้าเว็บของคุณที่ให้บริการผ่าน HTTPS มีแบบฟอร์มที่แจ้ง<form action="http://example.com/doSomething">และส่งข้อมูลบางอย่างที่ไม่ควรส่งชัดเจนเบราว์เซอร์จะส่งคำขอแบบเต็มก่อน (รวมถึงเอนทิตีถ้าเป็น POST) ไปยังไซต์ HTTP เป็นครั้งแรก การเปลี่ยนเส้นทางจะถูกส่งไปยังเบราว์เซอร์ทันทีและเนื่องจากผู้ใช้จำนวนมากปิดการใช้งานหรือเพิกเฉยต่อคำเตือนจึงมีโอกาสที่จะถูกละเว้น

แน่นอนว่าข้อผิดพลาดในการให้ลิงก์ที่ควรเป็นไปยังไซต์ HTTPS แต่ท้ายที่สุดแล้วสำหรับเว็บไซต์ HTTP อาจทำให้เกิดปัญหาทันทีที่คุณได้รับฟังพอร์ต HTTP บนที่อยู่ IP เดียวกันกับไซต์ HTTPS ของคุณ อย่างไรก็ตามฉันคิดว่าการรักษาทั้งสองไซต์เป็น "มิเรอร์" จะเพิ่มโอกาสในการทำผิดพลาดเท่านั้นเนื่องจากคุณอาจมีข้อสันนิษฐานว่าจะแก้ไขตัวเองโดยอัตโนมัติโดยเปลี่ยนเส้นทางผู้ใช้ไปยัง HTTPS ในขณะที่มักจะสายเกินไป (มีการอภิปรายคล้ายกันในคำถามนี้ )


1
เมื่อทำการตัดสินใจที่จะให้บริการทั้งไซต์ในฐานะ HTTPS การเปลี่ยนเส้นทางประเภทนี้เหมาะสม ฉันไม่ต้องการให้ผู้ใช้รับ 403 เพราะพวกเขาระบุ http สำหรับหน้า Landing Page ฉันเห็นด้วยถ้ามีคนระบุ http ในลิงก์และปรับใช้กับการผลิตที่ไม่ดี มันควรจะถูกจับในระหว่างการทดสอบแม้จะมีการเปลี่ยนเส้นทางในสถานที่ ฉันไม่ชอบการโต้แย้ง "สามารถ" เพราะสิ่งนี้ "เกิด" โดยไม่มีการเปลี่ยนเส้นทาง อาการจะเหมือนกันเมื่อทำการทดสอบในเบราว์เซอร์ที่ปลอดภัยยกเว้นหลังจากยืนยันว่าจะส่งอย่างชัดเจนมันจะเปลี่ยนเส้นทางแทนที่จะได้รับ 403
Derek Litz

ใช่ฉันเห็นประโยชน์ของการล้มเหลวอย่างหนักถ้ามีคนใส่ HTTP ในแบบฟอร์มโดยไม่ตั้งใจ แต่การผ่อนปรนกับ URL ที่พิมพ์ลงไปนั้นดูเหมือนว่าสำคัญกว่า
Daniel Lubarov

4
@Daniel ฉันเห็นด้วยว่ามีประโยชน์ที่จะผ่อนปรนเมื่อผู้ใช้พิมพ์ใน URL ฉันว่ามันเป็นหนึ่งในกรณีที่ดีกว่าที่จะปิดคุณลักษณะนี้ในระหว่างการพัฒนา / ทดสอบ แต่เปิดใช้งานในการผลิต (หรือในขั้นตอนสุดท้ายของการพัฒนา / ทดสอบ)
บรูโน่

ทำไมไม่ทำ http กับ https ที่ dns
มูฮัมหมัดอูเมอร์

1
@MuhammadUmer เพราะนี่ไม่เกี่ยวกับ DNS พวกเขาต้องการใช้ชื่อโฮสต์เดียวกันโดยทั่วไป แต่ถึงแม้จะมีชื่อโฮสต์อื่นคุณก็ยังต้องเปลี่ยนโปรโตคอลและพอร์ต
Bruno

18

ฉันพบว่าวิธีที่ดีที่สุดสำหรับ https และ www ในโดเมนคือ

RewriteCond %{HTTPS} off 
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]

สิ่งนี้จะไม่เปลี่ยนเส้นทางhttp://www.example.com/...เนื่องจากทั้งสองเงื่อนไขเป็นแบบ AND และ พวกเขาควรจะเป็น OR'd แทนเช่น รวมถึงการORตั้งค่าสถานะในเงื่อนไขแรก (และอย่าลืมหลีกเลี่ยงจุดสัญพจน์ใน regex) แต่ถ้าคุณมีการดำเนินการHSTSแล้วคุณไม่ต้องการที่จะเปลี่ยนเส้นทางไปยัง HTTPS และ www ในการเปลี่ยนเส้นทางเดียวที่คุณควรเปลี่ยนเส้นทางไปยัง HTTPS แรก
MrWhite

ฉันจะใส่ข้อความนี้ที่ไหน
Aaron Franke

ในคำถามประเภทเดียวกัน ทุกคนสามารถช่วยด้วยคำถามด้านล่าง? stackoverflow.com/questions/59503217/…
appsntech

14

นี่คือวิธีการเปลี่ยนเส้นทาง html ที่ใช้งานได้ แต่ไม่ใช่วิธีที่ดีที่สุด

 <meta http-equiv="Refresh" content="0;URL=https://www.example.com" />

วิธีการของ PHP

<?php
function redirectTohttps() {
    if ($_SERVER['HTTPS']!="on") {
        $redirect= "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        header("Location:$redirect"); 
    } 
}
?>

.htaccess approch

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

คัดลอกมาจาก: www.letuslook.org


ไม่อยู่ที่ไหน.htaccessไป? และลิงก์นั้นก็ตาย
Aaron Franke

8

ฉันชอบวิธีการเปลี่ยนเส้นทางจาก http ไปยัง https เพราะฉันไม่จำเป็นต้องแก้ไขสำหรับแต่ละไซต์

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

ฉันจะใส่ข้อความนี้ที่ไหน
Aaron Franke

6

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

RewriteEngine On

RewriteCond %{HTTPS} off

RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

หากคุณมีไฟล์. htaccess อยู่:

อย่าทำซ้ำ RewriteEngine On

ตรวจสอบให้แน่ใจว่าบรรทัดที่เริ่มต้น RewriteCond และ RewriteRule ปฏิบัติตาม RewriteEngine On ที่มีอยู่แล้วทันที


L และ R หมายถึงอะไร
Aaron Franke

5

นี่เป็นวิธีที่เหมาะสมในการเปลี่ยนเส้นทาง HTTP ไปยัง HTTPS โดยใช้. htaccess ตาม GoDaddy.com บรรทัดแรกของรหัสคืออธิบายตนเอง บรรทัดที่สองของรหัสจะตรวจสอบเพื่อดูว่าปิดหรือไม่และถ้าเป็นเช่นนั้นจะเปลี่ยนเส้นทาง HTTP ไปยัง HTTPS โดยเรียกใช้รหัสบรรทัดที่สามมิฉะนั้นบรรทัดที่สามจะถูกละเว้น

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

https://www.godaddy.com/help/redirect-http-to-https-automatically-8828


5

ทางออกที่ดีที่สุดขึ้นอยู่กับความต้องการของคุณ นี่คือบทสรุปของคำตอบที่โพสต์ก่อนหน้านี้โดยมีการเพิ่มบริบท

หากคุณทำงานกับเว็บเซิร์ฟเวอร์ Apache และสามารถเปลี่ยนการตั้งค่าได้ให้ทำตามเอกสาร Apache :

<VirtualHost *:80>
    ServerName www.example.com
    Redirect "/" "https://www.example.com/"
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

แต่คุณยังถามว่าคุณสามารถทำได้ใน.htaccessไฟล์หรือไม่ ในกรณีนี้คุณสามารถใช้RewriteEngineของ Apache ได้:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]

หากทุกอย่างทำงานได้ดีและคุณต้องการให้เบราว์เซอร์จดจำการเปลี่ยนเส้นทางนี้คุณสามารถประกาศให้เป็นแบบถาวรได้โดยเปลี่ยนบรรทัดสุดท้ายเป็น:

RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

แต่ระวังหากคุณเปลี่ยนใจเมื่อเปลี่ยนเส้นทางนี้ เบราว์เซอร์จดจำได้เป็นเวลานานและจะไม่ตรวจสอบว่ามีการเปลี่ยนแปลงหรือไม่

คุณอาจไม่ต้องการบรรทัดแรก RewriteEngine Onขึ้นอยู่กับการกำหนดค่าเว็บเซิร์ฟเวอร์

หากคุณมองหาโซลูชัน PHP ดูที่อาร์เรย์ $ _SERVERและฟังก์ชันส่วนหัว :

if (!$_SERVER['HTTPS']) {
    header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); 
} 

ดูเหมือนว่าเอกสาร Apache แนะนำให้เทียบกับเส้นทาง Rewrite เกี่ยวกับ Redirect มีอะไรอีกบ้างใน.htaccessไฟล์
Aaron Franke

ใช่การเปลี่ยนเส้นทางเป็นที่ต้องการและสามารถใช้ได้ใน. htaccess แต่คุณไม่สามารถเพิ่มเงื่อนไขเพื่อเปลี่ยนเส้นทางการรับส่งข้อมูล HTTP ไปยัง https เท่านั้น มันเปลี่ยนเส้นทาง https เช่นกัน -> วนรอบการเปลี่ยนเส้นทางไม่สิ้นสุด ฉันแสดงรายการไว้ในคำสั่ง VirtualHost ที่ใช้สำหรับ http (พอร์ต 80) ด้านบน. htaccess ไม่รองรับคำสั่งนั้นและดังนั้นการเปลี่ยนเส้นทางไม่สามารถใช้ที่นี่ได้
maikel

4

เพิ่มรหัสต่อไปนี้ไปยังไฟล์. htaccess:

Options +SymLinksIfOwnerMatch
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^ https://[your domain name]%{REQUEST_URI} [R,L]

โดยที่ [ชื่อโดเมนของคุณ] เป็นชื่อโดเมนของเว็บไซต์ของคุณ

คุณสามารถเปลี่ยนเส้นทางโฟลเดอร์เฉพาะออกจากชื่อโดเมนของคุณโดยแทนที่บรรทัดสุดท้ายของรหัสด้านบนด้วย:

RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L]

L และ R หมายถึงอะไร
Aaron Franke

4

ทำทุกอย่างที่อธิบายไว้ด้านบนเพื่อเปลี่ยนเส้นทาง เพียงเพิ่ม "HTTP Strict Transport Security" ไว้ในส่วนหัวของคุณ สิ่งนี้จะหลีกเลี่ยงมนุษย์ในการโจมตีตรงกลาง

แก้ไขไฟล์การกำหนดค่า apache ของคุณ (/etc/apache2/sites-enabled/website.conf และ /etc/apache2/httpd.conf เป็นต้น) และเพิ่มสิ่งต่อไปนี้เข้ากับ VirtualHost ของคุณ:

# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so

<VirtualHost 67.89.123.45:443>
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>

https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security


2

หากต้องการเปลี่ยนเส้นทางhttpคำขอทั้งหมดไปที่httpsคุณสามารถใช้:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]

หากไม่ได้เปิดใช้งาน mod-rewrite และคุณใช้ apache 2.4 คุณสามารถใช้คำสั่งRedirectด้านในifเพื่อเปลี่ยนเส้นทางhttpคำขอไปยังhttpsการร้องขอไปยัง

Apache 2.4

<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>

2

หากคุณอยู่ในสถานการณ์ที่คุณไม่สามารถเข้าถึงการกำหนดค่า apache โดยตรงสำหรับเว็บไซต์ของคุณซึ่งแพลตฟอร์มโฮสต์จำนวนมากยังคงถูก จำกัด ในลักษณะนี้ดังนั้นฉันขอแนะนำวิธีการสองขั้นตอน เหตุผลที่ Apache ทำเอกสารด้วยตนเองว่าคุณควรใช้ตัวเลือกการกำหนดค่าก่อนอื่น mod_rewrite สำหรับ HTTP to HTTPS

ก่อนอื่นตามที่กล่าวไว้ข้างต้นคุณต้องตั้งค่ากฎ. htaccess mod_rewrite ของคุณ:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

จากนั้นในไฟล์ PHP ของคุณ (คุณต้องทำสิ่งนี้ไม่ว่ามันจะเหมาะสมกับสถานการณ์ของคุณหรือไม่เว็บไซต์บางแห่งจะส่งคำขอทั้งหมดผ่านไฟล์ PHP ไฟล์เดียวส่วนเว็บไซต์อื่น ๆ จะให้บริการหน้าต่างๆตามความต้องการและคำขอของพวกเขา ):

<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>

ข้อมูลข้างต้นจำเป็นต้องเรียกใช้ก่อนที่จะมีรหัสที่อาจเปิดเผยข้อมูลที่ปลอดภัยในสภาพแวดล้อมที่ไม่ปลอดภัย ดังนั้นเว็บไซต์ของคุณใช้การเปลี่ยนเส้นทางอัตโนมัติผ่าน HTACCESS และ mod_rewrite ในขณะที่สคริปต์ของคุณทำให้มั่นใจได้ว่าไม่มีการแสดงผลใด ๆ เมื่อไม่ได้เข้าถึงผ่าน HTTPS

ฉันเดาว่าคนส่วนใหญ่ไม่คิดเช่นนี้ดังนั้น Apache แนะนำให้คุณไม่ใช้วิธีนี้หากเป็นไปได้ อย่างไรก็ตามจะใช้เวลาตรวจสอบเพิ่มเติมในตอนท้ายของการพัฒนาเพื่อให้แน่ใจว่าข้อมูลผู้ใช้ของคุณปลอดภัย หวังว่านี่จะช่วยให้คนอื่นที่อาจต้องใช้วิธีการที่ไม่แนะนำเนื่องจากข้อ จำกัด ในการสิ้นสุดบริการโฮสติ้งของเรา


1

ผ่าน. htaccess สิ่งนี้จะช่วยได้

RewriteEngine On


RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

นอกจากนี้อ้างถึงนี้เพื่อดูรายละเอียดเพิ่มเติม วิธีการเปลี่ยนเส้นทาง Http Https


1
นี่เป็นวิธีการแก้ปัญหาสำหรับผู้ที่ได้รับ "ข้อผิดพลาดการเปลี่ยนเส้นทางมากเกินไป" และไม่สามารถเปลี่ยนคุณสมบัติ allowOverride
Evochrome

1

นอกจากว่าคุณต้องการ mod_rewrite สำหรับสิ่งอื่น ๆ การใช้ Apache core IF directive นั้นสะอาดและเร็วขึ้น:

<If "%{HTTPS} == 'off'">
Redirect permanent / https://yoursite.com/
</If>

คุณสามารถเพิ่มเงื่อนไขเพิ่มเติมในคำสั่ง IF เช่นให้แน่ใจว่าเป็นโดเมนมาตรฐานเดียวโดยไม่มีคำนำหน้า www:

<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>

ความเฉื่อยมีความคุ้นเคยเป็นอย่างมากในการใช้ mod_rewrite สำหรับทุกสิ่ง แต่ดูว่ามันเหมาะกับคุณหรือไม่

ข้อมูลเพิ่มเติม: https://httpd.apache.org/docs/2.4/mod/core.html#if

หากต้องการดูในทางปฏิบัติ (ลองโดยไม่ต้องใช้ www หรือ https: // หรือกับ. net แทน. com): https://nohodental.com/ (เว็บไซต์ที่ฉันกำลังทำงานอยู่)


1

นำรหัสนี้มาให้คุณไฟล์. htaccess เปลี่ยนเส้นทาง HTTP เป็น HTTPS โดยอัตโนมัติ

RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]


สวัสดีขอบคุณสำหรับคำตอบคำตอบของคุณเพิ่มคำตอบที่มีอยู่อื่นที่ไม่มี
Gricey

ในคำถามประเภทเดียวกัน ทุกคนสามารถช่วยด้วยคำถามด้านล่าง? stackoverflow.com/questions/59503217/…
appsntech

0

ฉันพบวิธีการบังคับให้ทุกหน้าของไซต์เปลี่ยนเส้นทางจาก http เป็น analog ของหน้าเว็บใน https ที่เหมาะกับฉัน

RewriteEngine On 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

0
 Redirect 301 / https://example.com/

(ทำงานสำหรับฉันเมื่อไม่มีคำตอบข้างต้นทำงาน)

โบนัส:

ServerAlias www.example.com example.com

(แก้ไข https: // www .example.com ไม่พบ)


0

สิ่งนี้จะเปลี่ยนเส้นทาง URL ทั้งหมดไปที่ https และ www

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC,OR]
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]

0

หากคุณต้องการที่จะทำมันจากเซิร์ฟเวอร์ Tomcat ทำตามขั้นตอนด้านล่าง

ในเซิร์ฟเวอร์ HTTP ของ Apache Tomcat (8.5.x) แบบสแตนด์อโลนวิธีกำหนดค่าได้อย่างไรหากผู้ใช้พิมพ์ www.domain.com พวกเขาจะถูกส่งต่อไปยังเว็บไซต์ https (www.domain.com) โดยอัตโนมัติ

วิธีการ 2 ขั้นตอนของการรวมต่อไปนี้ใน [Tomcat_base] /conf/web.xml ของคุณก่อนแท็กปิด

step 1: 
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOnly</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>

และการตั้งค่าการตั้งค่าตัวเชื่อมต่อ [Tomcat_base] /conf/server.xml:

step 2:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443"/>
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="[keystorelocation]" type="RSA" />
</SSLHostConfig>
</Connector>

หมายเหตุ: หากคุณทำการตั้งค่า https แล้วและพยายามเปลี่ยนเส้นทางให้ทำตามขั้นตอนที่ 1 เท่านั้น



-1

ข้อแตกต่างของปัญหานี้คือเมื่อโหลดบาลานเซอร์เข้าสู่การเล่น

สถานการณ์มีดังนี้: - ปริมาณข้อมูลจากเบราว์เซอร์ไปยัง Load Balancer และย้อนกลับคือ (ควรเป็น) HTTPS - ปริมาณข้อมูลระหว่าง Load Balancer และ WebServer จริงคือ HTTP

ดังนั้นเซิร์ฟเวอร์ขอตัวแปรทั้งหมดใน PHP หรือ Apache แสดงว่าการเชื่อมต่อเป็นเพียง HTTP และไดเรกทอรี HTTP และ HTTPS บนเซิร์ฟเวอร์เหมือนกัน

RewriteCondition ในคำตอบที่อนุมัติไม่ทำงาน มันให้ทั้งวงหรือไม่ทำงาน

คำถามคือทำอย่างไรถึงจะทำให้โหลดบาลานเซอร์ทำงานได้

(หรือ Load Balancer ถูกตั้งค่าผิดซึ่งเป็นสิ่งที่ฉันหวังไว้เพราะจากนั้นฉันสามารถย้ายปัญหาไปที่ บริษัท WebHosting :-))


การเปลี่ยนเส้นทางจะเกิดขึ้นกับ load balancer แทน ขึ้นอยู่กับชนิดของ load balancer สิ่งนี้ควรเป็นไปได้ในการกำหนดค่าหรือเป็นอินสแตนซ์ apache เองซึ่งคำตอบที่ยอมรับจะใช้งานได้ ไม่ต้องทำบนโหนดเดี่ยว
marc82ch

-1

หากคุณกำลังใช้ตัวโหลดยืดหยุ่นของ Amazon Web Services ซึ่งยอมรับการรับส่งข้อมูล https และกำหนดเส้นทางไปยังเซิร์ฟเวอร์ของคุณด้วย http วิธีที่ถูกต้องในการเปลี่ยนเส้นทางการรับส่งข้อมูล HTTP ทั้งหมดไปยัง https อธิบายไว้ที่นี่ https://aws.amazon co.th / premiumsupport / ความรู้ / ศูนย์การเปลี่ยนเส้นทาง-http-https-ELB

ใช้ส่วนหัว X-Forwarded-Proto (มี http หรือ https) ซึ่งจะรวมอยู่ในคำขอ HTTP จาก load balancer ดังที่อธิบายไว้ที่นี่: https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x- ส่งต่อ-headers.html

ในไฟล์ httpd.conf:

<VirtualHost *:80>

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

</VirtualHost>

หรือในรูทไฟล์. htaccess ของคุณ:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

โบนัส: มันจะไม่พยายามเปลี่ยนเส้นทางการรับส่งข้อมูล http บนเครื่องพัฒนาท้องถิ่นของคุณ


-1

มันเหมาะกับฉัน:

<IfModule mod_rewrite.c>
 RewriteEngine On
  RewriteCond %{HTTPS} !on
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

และตัวอย่างเช่นhttp: // server / foo? email = someone% 40example.comเปลี่ยนเส้นทางโดยปกติโดยไม่มีปัญหาใด ๆ ไฟล์. htaccess อยู่ในโฟลเดอร์รูทของเว็บไซต์ (เช่นชื่อ public_html) เป็นไปได้ที่จะใช้ RewriteCond% {SERVER_PORT}! ^ 443 $แทนRewriteCond% {HTTPS}!

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