คุณเปลี่ยนเส้นทาง HTTPS เป็น HTTP ได้อย่างไร


166

คุณเปลี่ยนเส้นทาง HTTPS เป็น HTTP ได้อย่างไร นั่นคือสิ่งที่ทุกคนสอน (ตรงกันข้าม)

ฉันมีเซิร์ฟเวอร์บน HTTPS ซึ่งฉันจ่ายการรับรอง SSL สำหรับและมิเรอร์ที่ฉันไม่ได้และเก็บไว้สำหรับกรณีฉุกเฉินเพียงเพื่อจะได้ไม่ได้รับการรับรอง

บนเดสก์ท็อปของลูกค้าฉันมีทางลัดบางอย่างซึ่งชี้ไปที่http://production_serverและhttps://production_server(ทั้งสองทำงาน) อย่างไรก็ตามฉันรู้ว่าถ้าเซิร์ฟเวอร์การผลิตของฉันล่มการส่งต่อ DNS จะเริ่มต้นขึ้นและลูกค้าที่มี "https" บนทางลัดของพวกเขาจะจ้องมองที่https://mirror_server(ซึ่งใช้งานไม่ได้) และหน้าจอสีแดงขนาดใหญ่ของ Internet Explorer 7 สำหรับ บริษัท ของฉัน

น่าเสียดายที่ฉันไม่สามารถสลับสิ่งนี้ในระดับลูกค้า ผู้ใช้เหล่านี้ไม่รู้หนังสือคอมพิวเตอร์มากและมีแนวโน้มที่จะประหลาดใจที่เห็นข้อผิดพลาด "ความไม่มั่นคง" ของ HTTPS (โดยเฉพาะอย่างยิ่งวิธีที่ Firefox 3 และ Internet Explorer 7 จัดการกับมันในปัจจุบัน: FULL STOP, ขอบคุณมาก ๆ

มันง่ายมากที่ จะหา โซลูชัน Apacheสำหรับการเปลี่ยนเส้นทาง http-> httpsแต่สำหรับชีวิตของฉันฉันไม่สามารถทำสิ่งที่ตรงกันข้ามได้

ไอเดีย?


2
อย่าทำอย่างนั้น ! HTTPS การเปลี่ยนเส้นทางจาก HTTP เป็นสิ่งที่อันตรายอย่างยิ่ง (และอันที่จริงจะถูกปิดกั้นโดยเบราว์เซอร์ทั้งหมดในไม่ช้าเนื่องจากการละเมิด) โดยเฉพาะอย่างยิ่งถ้านี่คือโหนดผ่านสถานะ HTTP ที่เงียบ (แต่สิ่งเดียวกันนี้เป็นจริงถ้า javascript) (1) มีหน้าจอดชั่วคราว HTTPS ที่เชิญชวนให้ผู้ใช้เลื่อนการเชื่อมโยงโดยคลิกมันอย่างแข็งขัน หรือ: - (2) HTTPS เปลี่ยนเส้นทางไปยัง HTTP บนโดเมนSAMEและการเปลี่ยนเส้นทางจะไม่เปลี่ยนประเภทเนื้อหาที่ร้องขอ การอนุญาตในเบราว์เซอร์ทำให้มัลแวร์จำนวนมากผ่านการแยกออกจากกัน การเปลี่ยนเส้นทางดังกล่าวเป็นการหลอกลวงมาก
verdy_p

4
ดูเหมือนว่าเว็บไซต์ภายในที่ OP รู้ว่าเกิดอะไรขึ้นกับมันและไม่เป็นอันตราย ... หากนี่เป็นเว็บเซิร์ฟเวอร์ที่เปิดอยู่ฉันเห็นด้วยกับคุณ แต่เป็นเว็บเซิร์ฟเวอร์ภายในเท่านั้น แฟชั่นนี้จะไม่เป็นปัญหา
Stese

@verdy_p ฉันกำลังทำงานกับ HTTPS ไปยังการเปลี่ยนเส้นทาง HTTP 302 ซึ่งเป็นกรณีของพอร์ทัล captive คุณช่วยชี้ให้ฉันดูเอกสารที่คุณอ้างถึงได้ไหม
j Cyprusakova

สำหรับพอร์ทัลแบบ Captive อย่าทำการเปลี่ยนเส้นทาง HTTPS เป็น HTTP 302 ใด ๆ เลยยกเว้นในกรณีที่ตรงกับโดเมนเดียวกัน (ไม่ใช่โดเมนย่อย) และเนื่องจากมีความเสี่ยงสูงในการเปิดเผยข้อมูลระวังการใช้โทเค็นและคุกกี้ของเซสชั่นอย่างโปร่งใสด้วยการเปลี่ยนเส้นทาง คุณควรรู้ว่าเป้าหมาย HTTP สามารถ tweaked และข้อมูลที่ดำเนินการโดยผู้รับมอบฉันทะโปร่งใสและมัลแวร์ DNS ที่เป็นอันตราย: custoer ของคุณอาจไม่ทราบว่าเป้าหมาย HTTP-only ของคุณจะไม่สามารถเข้าถึงได้และจะไปที่ blackhat! ดังนั้นอย่าทำเช่นนั้นในลิงก์ HTTPS ที่มีเซสชัน / คุกกี้ / คำขอส่วนตัว
verdy_p

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

คำตอบ:


128

สิ่งนี้ไม่ได้รับการทดสอบ แต่ฉันคิดว่ามันควรจะทำงานโดยใช้ mod_rewrite

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

1
ฉันจะทำให้มันทำงานได้อย่างไร (ฉันต้องเปลี่ยนอะไรจากรหัสนี้เป็นโดเมนของฉันเพื่อให้รหัสนี้ใช้งานได้)
Enve

1
Enve: เพียงเพิ่มการกำหนดค่า vhost_ssl.conf ของไซต์ของคุณ (หรือ. htaccess ที่รูทของไซต์) ไม่ต้องเปลี่ยนอะไรเลยโดยจะใช้ชื่อโฮสต์และพา ธ URL เดียวกัน
Darren Felton

1
ฉันคิดว่าคุณอาจต้องการจับสตริงการสืบค้นด้วย ฉันไม่แน่ใจ แต่ฉันคิดว่าตัวอย่างข้างต้นจะไม่ส่งต่อสตริงข้อความค้นหาจาก https ไปยัง http
Rustavore

12
ตามที่ชี้โดย Kieron ด้านล่างสิ่งนี้จะไม่ทำงานหากเซิร์ฟเวอร์มิเรอร์ไม่มีใบรับรองที่ถูกต้อง คุณยังคงเห็นคำเตือนสีแดงขนาดใหญ่เนื่องจากใบรับรองไม่ถูกต้อง เมื่อคุณเริ่มใช้ https คุณจะติดอยู่กับมัน เตรียมพร้อมที่จะจ่ายให้ตลอดชีวิตที่เหลือของคุณ หากคุณหยุดจ่ายเงินคนที่บุ๊คมาร์คลิงก์ https จะไม่สามารถผ่านได้
สตีเฟ่นเฉิง

2
จ่ายสำหรับส่วนที่เหลือของชีวิตของคุณ? คุณยังสามารถใช้ HTTPS แต่เปลี่ยนผู้ให้บริการ PKI ของคุณและรับใบรับรองราคาถูกกว่าใหม่ คุณจะยังคงจ่ายไม่กี่ bucks ใช่ แต่ก็เป็นจริงสำหรับชื่อโดเมนและโฮสติ้งของคุณ! ใบรับรอง PKI ตอนนี้ไม่แพงเมื่อเทียบกับชื่อโดเมนและไม่มีนัยสำคัญเมื่อเทียบกับต้นทุนการโฮสต์ / แบนด์วิดท์!
verdy_p

71

โปรดทราบว่าเอ็นจิ้น Rewrite จะเริ่มทำงานเมื่อได้รับคำขอ HTTP เท่านั้น - ซึ่งหมายความว่าคุณยังคงต้องการใบรับรองเพื่อให้ลูกค้าสามารถตั้งค่าการเชื่อมต่อเพื่อส่งคำขอได้!

อย่างไรก็ตามหากเครื่องสำรองข้อมูลจะมีชื่อโฮสต์เหมือนกัน (เท่าที่ลูกค้าเป็นกังวล) ดังนั้นคุณไม่ควรใช้ใบรับรองเดียวกันกับเครื่องผลิตหลัก


1
ข้อ จำกัด นี้จะเอาชนะได้อย่างไร? ฉันมีปัญหาเดียวกัน รับข้อผิดพลาดของใบรับรองจากเบราว์เซอร์ก่อนการเปลี่ยนเส้นทาง
Sandeep Balagopal

มันจะดีที่มีการเปลี่ยนเส้นทางกลับไปที่ HTTP หากมีข้อผิดพลาดใบรับรอง
Jeffrey the Giraffe

นั่นเอาชนะจุดประสงค์ของการมี HTTPS อย่างสมบูรณ์ในตอนแรก
FluffyBeing

12

ตามคำตอบของ ejunker นี่เป็นทางออกสำหรับฉันไม่ใช่เซิร์ฟเวอร์เดียว แต่ใช้กับสภาพแวดล้อมแบบคลาวด์

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{ENV:HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

ใช้ 301 อาจเป็นอันตรายเล็กน้อย 301 หมายถึงลบออกอย่างถาวรและฉันเดาว่าการเปลี่ยนจาก https เป็น http เป็นการชั่วคราว ดูคำตอบนี้ได้รับการยอมรับสำหรับสิ่งที่ข้อเสียก็จะเป็นผู้ใช้stackoverflow.com/questions/1393280/...
yusuf TEZEL

ความแตกต่างแบบถาวร / ชั่วคราว 301/302 เกี่ยวข้องกับเครื่องมือค้นหาเท่านั้น
matthewv789

9

สำหรับผู้ที่กำลังใช้.confไฟล์

<VirtualHost *:443>
    ServerName domain.com
    RewriteEngine On
    RewriteCond %{HTTPS} on
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/domain.crt
    SSLCertificateKeyFile /etc/apache2/ssl/domain.key
    SSLCACertificateFile /etc/apache2/ssl/domain.crt

</VirtualHost>

8

หากวิธีการแก้ปัญหาข้างต้นไม่ได้ผลสำหรับคุณ (ไม่เหมาะสำหรับฉัน) นี่คือสิ่งที่ใช้กับเซิร์ฟเวอร์ของฉัน:

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]

6
บ่อยครั้งคุณจะไม่ต้องการL,(ซึ่งหมายถึง "กฎล่าสุด") หากคุณใช้ wordpress หรือ CMS อื่นการLตั้งค่าสถานะอาจป้องกันไม่ให้คำขอหน้าเว็บถูกกำหนดเส้นทางอย่างเหมาะสม ใช้แทน:RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301]
Rustavore

5

ทั้งหมดข้างต้นไม่ได้ทำงานเมื่อฉันใช้ cloudflare อันนี้เหมาะกับฉัน:

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

และอันนี้ทำงานอย่างแน่นอนโดยไม่ต้องผู้รับมอบฉันทะในทาง:

RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

3

เป็นการดีกว่าที่จะหลีกเลี่ยงการใช้ mod_rewrite เมื่อคุณทำได้

ในกรณีของคุณฉันจะแทนที่ Rewrite ด้วยสิ่งนี้:

    <If "%{HTTPS} == 'on'" >
            Redirect permanent / http://production_server/
    </If>

<If>สั่งจะใช้ได้เฉพาะใน Apache 2.4+ ตามนี้บล็อกที่นี่


ในสภาพแวดล้อมที่โฮสต์เราสามารถตรวจสอบเวอร์ชั่นของ Apache ได้โดยใช้/usr/sbin/httpd -v
Serge Stroobandt

1

มันใช้งานได้สำหรับฉัน

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

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

ต้องแน่ใจว่าได้ฟังทั้งพอร์ต 80 และ 443


0

ไม่มีคำตอบใดที่เหมาะกับฉันบนเว็บไซต์ Wordpress แต่ทำงานต่อไปนี้ (คล้ายกับคำตอบอื่น ๆ แต่มีการเปลี่ยนแปลงเล็กน้อย)

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

อย่าใช้กฎดังกล่าวสุ่มสี่สุ่มห้ากับ REQUEST_URI ทั้งหมด (ไม่ควรใช้หากมีข้อมูลแบบฟอร์มใด ๆ ใน URI หรือรหัสคุกกี้ / เซสชันในข้อมูลเมตาคำขอ) ใช้สำหรับหน้า / ภาพสาธารณะคงที่เท่านั้น หลีกเลี่ยงมันอย่างสมบูรณ์สำหรับ javascripts หรือส่วนประกอบที่ใช้งานอยู่ (โดยเฉพาะวิดีโอสตรีมแบบ scriptable หรือ PDF ที่ใช้งานนอกเสียจากว่าคุณลงชื่อด้วยระบบดิจิทัล! คุณยังไม่สามารถลงนาม Javascript แบบดิจิทัลเก็บไว้ในโดเมนที่ปลอดภัยของคุณเท่านั้น)
verdy_p

หมายเหตุ: บางรูปแบบรูปภาพใช้งานได้และสคริปต์: ระวังเกี่ยวกับ SVG เช่น เราได้เห็นการโจมตีในเว็บไซต์ HTTPS บางแห่งที่โหลดภาพ SVG จาก HTTP (ด้วยการเปลี่ยนเส้นทาง 302 เว็บไซต์) และเก็บเกี่ยวโดยมัลแวร์ที่แทรกสคริปต์ในเนื้อหา SVG ... เบราว์เซอร์ที่ดีควรแยกเนื้อหาย่อย HTTP จาก HTTPS และวางไว้ในแซนด์บ็อกซ์ ข้อ จำกัด ด้านความปลอดภัยก็ควรนำมาใช้เช่นกันแม้ว่าจะอยู่ในชื่อโดเมนเดียวกัน ... ) ดังนั้น "http: // (โดเมน) / ... " และ "https: // (โดเมน) /" จะถือว่าเป็นโดเมนที่แตกต่างกันสำหรับ CORS (ไม่ใช่แหล่งกำเนิดเดียวกัน) แม้ว่าจะอยู่ในหมายเลขพอร์ต TCP เดียวกัน
verdy_p

@verdy_p คุณหมายถึงอะไร "กับ 302 การเปลี่ยนเส้นทางของเว็บไซต์" คุณต้องเป็นเจ้าของไซต์เซิร์ฟเวอร์ก่อน (หรือโหนดผู้เข้าร่วมในระดับ TCP / IP เช่นเซิร์ฟเวอร์ DNS เราเตอร์) เพื่อใช้ประโยชน์จากการร้องขอทรัพยากร HTTP เหล่านั้นใช่ไหม
Sz.

ไม่จำเป็น. HTTPS บนโดเมนจะปลอดภัยในขณะที่ HTTP ในโดเมนเดียวกันจะไม่เป็น (การโจมตีไม่จำเป็นต้องควบคุม IP หรือเราเตอร์หรือเซิร์ฟเวอร์ DNS แม้เมื่อใช้ DNSSEC การหาช่องโหว่นั้นสามารถใช้การปลอมแปลง IP ซึ่งไม่สามารถตรวจพบได้อย่างปลอดภัยโดยไม่ใช้ HTTPS เซสชันที่ปลอดภัย) ดังนั้นฉันจึงยืนยันว่าไซต์ HTTPS ต้องโฮสต์รูปภาพ (แม้ในโดเมนเดียวกัน) โดยไม่ให้บริการด้วย HTTP (โดยปกติแล้วจะถูกปฏิเสธในเบราว์เซอร์บางตัวที่ต้องคลิกเปิดใช้งานหรือปิดบังภาพที่ไม่ปลอดภัย) ต้องห้าม HTTPS / HTTP แบบผสม: ไซต์สามารถโจมตีได้ในส่วน HTTP (เช่นพิกเซลการติดตาม)
verdy_p

-6

เท่าที่ฉันทราบว่าการรีเฟรชเมตาง่ายยังทำงานได้โดยไม่ทำให้เกิดข้อผิดพลาด:

<meta http-equiv="refresh" content="0;URL='http://www.yourdomain.com/path'">

12
ฉันหวังว่าผู้ลงคะแนนเสียงจะต้องแสดงความคิดเห็นเพื่ออธิบายเหตุผลของการลงคะแนนเสียง โดยส่วนตัวฉันจะไม่เลือกคำตอบนี้หากคุณในฐานะนักพัฒนาซอฟต์แวร์ไม่สามารถเข้าถึงเซิร์ฟเวอร์ที่คุณพัฒนา แต่คุณมีสิทธิ์เข้าถึงหน้านี้ ปัญหาหนึ่งคือคุณต้องฮาร์ดโค้ดทุกเส้นทางในทุกหน้าเพื่อให้ใช้งานได้ หากคุณสามารถสันนิษฐานได้ว่ามีการเปิดใช้งาน JavaScript สำหรับกรณีการใช้งานที่สำคัญของคุณคุณควรใช้ JavaScript เพื่อเปลี่ยนเป็น http คำตอบข้างต้นจะดีกว่าเพราะพวกเขาไม่ต้องการจาวาสคริปต์เพราะเกิดขึ้นที่เซิร์ฟเวอร์
Rustavore

2
เพียงเพราะ htaccess เป็นตัวเลือกที่ดีกว่านั้น นอกจากนี้มันจะไม่แก้ไขปัญหาในการเปลี่ยนเส้นทางโปรโตคอล https ไปยัง http หากคุณไม่มีใบรับรอง
midudev

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