HSTS และ double redirect


9

ฉันจัดการเว็บไซต์เล็ก ๆ น้อย ๆ ในสภาพแวดล้อม LAMP ของโฮสติ้งที่ใช้ร่วมกัน: สิ่งนี้โดยทั่วไปหมายถึงสิ่งเดียวที่ฉันสามารถแก้ไขได้คือไฟล์ htaccess

ฉันต้องการเพิ่มการสนับสนุน HSTS (และฉันทำได้) แต่เมื่อฉันทดสอบเว็บไซต์ของฉันที่นี่เพื่อรับสิทธิ์โหลดล่วงหน้า HSTS ฉันได้รับข้อผิดพลาดต่อไปนี้:

ข้อผิดพลาด: HTTP เปลี่ยนเส้นทางไปที่ www ก่อน

http://example(HTTP) ควรเปลี่ยนเส้นทางไปที่https://example(HTTPS) ทันทีก่อนที่จะเพิ่มโดเมนย่อย www ในตอนนี้การเปลี่ยนเส้นทางครั้งแรกคือhttps://www.example.การเปลี่ยนเส้นทางเพิ่มเติมเป็นสิ่งจำเป็นเพื่อให้แน่ใจว่าเบราว์เซอร์ที่รองรับ HSTS จะบันทึกรายการ HSTS สำหรับโดเมนระดับบนสุดไม่ใช่เฉพาะโดเมนย่อย

ดังนั้นฉันคิดว่าฉันควรเปลี่ยนเส้นทางผู้ใช้ด้วยวิธีนี้:

  1. http://example (นี่คือสิ่งที่ผู้ใช้ป้อนในแถบที่อยู่ของเบราว์เซอร์)
  2. https://example (เราเปลี่ยนเส้นทางเขาไปยังเว็บไซต์รุ่น HTTPS)
  3. https://www.example (เราเปลี่ยนเส้นทางเขาอีกครั้งเพื่อ www โดเมนย่อย)

การเปลี่ยนเส้นทางปัจจุบันของฉันทำได้ดังนี้:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

ฉันพยายามเพิ่มการเปลี่ยนเส้นทางก่อนบรรทัดสุดท้ายด้วยวิธีนี้:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

แต่ฉันได้รับข้อผิดพลาด "หน้าไม่สามารถเปลี่ยนเส้นทางอย่างถูกต้อง" จากเบราว์เซอร์

ดังนั้นวิธีใดที่เหมาะสมในการเปลี่ยนเส้นทางผู้ใช้จากรุ่น http ของเว็บไซต์ไปยัง https และในที่สุดก็ไปที่ https ด้วย www? และ: มีความเสี่ยงหรือไม่?

คำตอบ:


10

ตามที่ระบุไว้ในข้อกำหนดการส่งรายการพรีโหลด HSTS :

  1. เปลี่ยนเส้นทางจาก HTTP เป็น HTTPS บนโฮสต์เดียวกันหากคุณกำลังฟังพอร์ต 80

คุณต้องเปลี่ยนเส้นทางไปยังโฮสต์เดียวกัน (เช่น. HTTP_HOST) ไม่ใช่เพียงไปที่example.comแรก คุณไม่จำเป็นต้องเปลี่ยนเส้นทางexample.comหากผู้ใช้กำลังร้องขอwww.example.comโดยตรง (การทดสอบจะเกี่ยวข้องกับการร้องขอexample.com) หลังจากนั้นคุณสามารถเปลี่ยนเส้นทางไปยังโดเมนย่อย www canonical หากต้องการ

ฉันพยายามเพิ่มการเปลี่ยนเส้นทางก่อนบรรทัดสุดท้ายด้วยวิธีนี้:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

นั่นจะสร้างลูปการเปลี่ยนเส้นทางเนื่องจากRewriteCondคำสั่งก่อนหน้านี้ใช้กับคำสั่งแรกRewriteRuleเท่านั้นดังนั้นคำสั่งที่สองRewriteRuleจะรันแบบไม่มีเงื่อนไข

ลองทำสิ่งต่อไปนี้แทน:

# HTTP to HTTPS redirect
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L]

# Canonical www redirect
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R,L]

HTTP_HOSTตัวแปรของเซิร์ฟเวอร์มีค่าของHostส่วนหัวคำขอ HTTP (เช่น. สิ่งที่เป็นเจ้าภาพมีการร้องขอ)

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

โปรดทราบว่าสิ่งเหล่านี้คือ 302 (ชั่วคราว) การเปลี่ยนเส้นทาง เปลี่ยนเป็น 301 ต่อเมื่อคุณมั่นใจว่าใช้งานได้จริง

และ: มีความเสี่ยงหรือไม่?

ไม่มีความเสี่ยง ใช่อาจมีการเปลี่ยนเส้นทางสองครั้งก่อนหน้านี้อาจมีเพียงการเปลี่ยนเส้นทางครั้งเดียวเท่านั้น (ซึ่งมีประสิทธิภาพน้อยกว่าเนื้อหา) แต่ยังมีการเปลี่ยนเส้นทางเพียงสองรายการเท่านั้นซึ่งถือว่าดีสำหรับ SEO นอกจากนี้ด้วย HSTS ตัวแทนผู้ใช้จะได้รับประสบการณ์การเปลี่ยนเส้นทางสองครั้งมากที่สุดเพียงครั้งเดียว


RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

นอกเหนือ: (ไม่สนใจ HSTS สักครู่ ... ) สิ่งนี้ยังไม่เสร็จสมบูรณ์เนื่องจากไม่มีการร้องขอhttps://example.com/...(เช่น HTTPS และ apex โดเมน)


อ่านเพิ่มเติม:

  • คำตอบของฉันสำหรับคำถามที่เกี่ยวข้องกับ Pro Webmasters SE ซึ่งมีรายละเอียดเพิ่มเติมเกี่ยวกับการใช้ HSTS ใน.htaccess: https://webmasters.stackexchange.com/a/112264/52912

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

1
Btw ทางออกของคุณสมบูรณ์แบบ! :-)

1
"แผงควบคุมการเปลี่ยนเส้นทางในเครื่องมือจัดการเว็บไซต์ผู้ให้บริการโฮสติ้ง" - ฉันมักจะระมัดระวังเครื่องมือดังกล่าว ตัวอย่างเช่นส่วนการเปลี่ยนเส้นทางใน cPanel นั้นมี จำกัด มากและค่อนข้างมีชื่อเสียง
MrWhite

1
ขึ้นอยู่กับว่าคุณตั้งค่าStrict-Transport-Securityส่วนหัวการตอบกลับอย่างไร ตัวอย่างเช่นในการตั้งค่านี้ในการเปลี่ยนเส้นทางคุณจะต้องใช้alwaysอาร์กิวเมนต์ในHeaderคำสั่ง ผมตอบคำถามที่เกี่ยวข้องในโปรเว็บมาสเตอร์สแต็ค (ข้ามส่วนแรกของคำตอบของฉันเกี่ยวกับon/ off) ซึ่งเข้าไปในรายละเอียดเพิ่มเติมเกี่ยวกับการดำเนินการ "HSTS พรีโหลด " .htaccessใน
MrWhite

1
ไม่เป็นไร ความจริงแล้วPro Webmasters stackน่าจะเหมาะสมกว่าสำหรับ.htaccessคำถามที่เกี่ยวข้องเพียงอย่างเดียว (ServerFault ถือว่าคุณสามารถควบคุมเซิร์ฟเวอร์ได้อย่างสมบูรณ์ซึ่งในกรณีนี้คุณจะไม่ทำเช่นนี้.htaccess) มันง่ายกว่าที่จะใช้สิ่งนี้ในการกำหนดค่าเซิร์ฟเวอร์โดยใช้<VirtualHost>คอนเทนเนอร์แยกต่างหาก(เนื่องจากคุณไม่จำเป็นต้องยุ่งกับ env vars และเงื่อนไขเพิ่มเติม- มัน "สะอาด" และมีแนวโน้มที่จะเกิดข้อผิดพลาดน้อยกว่า) ฉันไม่คิดว่าฉันจะแนะนำการส่ง "รายการพรีโหลด" หากคุณมีสิทธิ์เข้าถึง.htaccessเท่านั้น (2c ของฉัน)
MrWhite
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.