RewriteCond %{REQUEST_URI} !.*index\.html
RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]
มีปัญหาสองสามข้อเกี่ยวกับเรื่องนี้...
ดูเหมือนว่าคุณจะขาด เขียนกฎใหม่
ลวดลาย (อาร์กิวเมนต์แรก) อย่างสมบูรณ์ ดังนั้นคำสั่งนี้จะล้มเหลวในการจับคู่
หากสิ่งนี้ตรงกันก็จะขึ้นต้นด้วย www.
โดเมนย่อย อีกครั้ง. ฉันถือว่าคุณกำลังใส่การเปลี่ยนเส้นทางนี้ หลังจาก การเปลี่ยนเส้นทางตามรูปแบบบัญญัติ (HTTP เป็น HTTPS และไม่ใช่ www ไปยัง www) อย่างที่ควรจะเป็น ดังนั้นสิ่งนี้จะเปลี่ยนเส้นทางไปที่ https://www.www.example.com/index.html
เนื่องจากเมื่อมีการทริกเกอร์การเปลี่ยนเส้นทางนี้ ชื่อโฮสต์จะเป็นที่ยอมรับอยู่แล้ว
เดอะ เงื่อนไข (เขียนซ้ำ
คำสั่ง) ไม่จำเป็นจริงๆ เนื่องจากการตรวจสอบนี้ (ที่ /index.html
ยังไม่ได้ร้องขอ) สามารถจัดการได้อย่างมีประสิทธิภาพมากขึ้นโดย เขียนกฎใหม่
คำสั่งนั้นเอง
ตัวอย่างเช่น:
RewriteRule !^index\.html$ /index.html [R=302,L]
ไม่จำเป็นต้องรวมโครงร่าง+ชื่อโฮสต์ใน การแทน สตริงเนื่องจากคุณต้องการเปลี่ยนเส้นทางไปยังสิ่งเดียวกันอยู่ดี หากคุณต้องการให้ชัดเจน คุณสามารถเขียน https://%{HTTP_HOST}/index.html
.
โปรดทราบว่าตามที่มันยืน index.html
ไม่สามารถอ้างอิงอื่นใดได้ ท้องถิ่น ทรัพยากร (รูปภาพ, CSS, JavaScript ฯลฯ) เนื่องจากคำขอเหล่านี้จะถูกเปลี่ยนเส้นทางด้วย ในการอนุญาตให้เข้าถึงทรัพยากรในเครื่อง คุณจะต้องเพิ่มเงื่อนไขสองสามข้อเพื่อยกเว้นคำขอทรัพยากรแบบคงที่
RewriteCond %{REQUEST_URI} !.\.(jpg|png|webp|css|js)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.html$ /index.html [R=302,L]
หรือโฮสต์ทรัพยากรเหล่านี้บนโดเมนภายนอก (หรือในไดเร็กทอรีย่อยและไม่รวมไดเร็กทอรีย่อยทั้งหมด)
อย่างไรก็ตาม หากเลือก "เปลี่ยนเส้นทาง" เลย ฉันอาจเปลี่ยนเส้นทางไปยังไฟล์ที่มีชื่อเฉพาะ/มีความหมายมากกว่า เช่น /coming-soon.html
. ปัญหาการใช้งาน /index.html
คือถ้าคุณต้องการแสดงเนื้อหาอื่นใน URL นั้นในภายหลัง และถูกแคชไว้ (ไม่ว่าด้วยเหตุผลใดก็ตาม) แม้ว่า /coming-soon.html
น่าจะเป็น "noindex"
อย่างไรก็ตาม อาจเป็นการดีกว่าที่จะไม่เปลี่ยนเส้นทางเลยและให้บริการ ก ชั่วคราว การตอบสนอง "503 บริการไม่พร้อมใช้งาน" ดู คำตอบของฉัน สำหรับคำถามต่อไปนี้ใน Webmasters stack สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้:
นอกเหนือ:
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond ลด %{HTTPS}
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
คุณอยู่เบื้องหลังพร็อกซีฟรอนต์เอนด์ที่จัดการการเชื่อมต่อ SSL หรือไม่
หากคุณเป็นเช่นนั้นก็ไม่เป็นไร แม้ว่าเงื่อนไขที่สองจะตรวจสอบ HTTPS
ตัวแปรเซิร์ฟเวอร์จึงไม่จำเป็น แต่ถ้าคุณเป็น ไม่ หลังพร็อกซี SSL คำสั่งเหล่านี้มีความเสี่ยงที่จะถูกหลีกเลี่ยง (เช่น ผู้ใช้ไม่ได้ถูกเปลี่ยนเส้นทางไปยัง HTTPS) หาก X-ส่งต่อโปรโต: https
ส่วนหัวถูกฉีดเข้าไปในคำขอ
อัปเดต:
ตกลงมันใช้งานได้ตามที่ฉันต้องการ แต่ฉันสามารถรวมเข้าด้วยกันได้หรือไม่?
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond ลด %{HTTPS}
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_URI} !.*coming-soon\.html [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/coming-soon.html [R=302,L]
ดังที่กล่าวไว้ข้างต้น โดยพื้นฐานแล้วกฎข้อสุดท้ายจะเหมือนกับกฎต่อไปนี้ (เมื่อใช้ร่วมกับการเปลี่ยนเส้นทางตามรูปแบบบัญญัติก่อนหน้า) ซึ่งง่ายกว่าและมีประสิทธิภาพมากกว่า:
RewriteRule !^coming-soon\.html$ /coming-soon.html [R=302,L]
ในกฎข้อที่สอง คุณควรเปลี่ยน เขียนกฎใหม่
ลวดลาย จาก ^(.*)$
ถึง ^
(เช่นเดียวกับกฎข้อแรก) ^(.*)$
จับการอ้างอิงย้อนกลับโดยไม่จำเป็นและมีประสิทธิภาพน้อยลง
คุณได้กล่าวถึงในความคิดเห็นก่อนหน้า (ตอนนี้ถูกลบไปแล้ว) ว่าคุณต้องการให้สิ่งนี้ใช้ได้กับโดเมนย่อยใดๆ ด้วย มัน "ใช้งานได้" สำหรับโดเมนย่อยใดๆ อย่างไรก็ตาม มันจะเพิ่มส่วนเพิ่มเติมเสมอ www
โดเมนย่อยซึ่งอาจเป็นที่ต้องการหรือไม่ก็ได้ (ไม่ธรรมดาที่จะมี www
โดเมนย่อยบน โดเมนย่อย. วายเอ็มเอ็มวี.)
ไม่จำเป็นต้อง "รวม" กฎเหล่านี้เข้าด้วยกัน คุณไม่สามารถรวมเข้าด้วยกันได้หากคุณต้องการให้ 301 เปลี่ยนเส้นทางไปที่ www+HTTPS ก่อนที่ 302 จะเปลี่ยนเส้นทางไปยังหน้า "เร็ว ๆ นี้" แม้ว่ากฎสองข้อแรก (การเปลี่ยนเส้นทาง 301 รายการ) สามารถ "รวมกัน" เป็นกฎข้อเดียวได้ กฎนี้ไม่มีประโยชน์ใดๆ
ปัญหาเล็กน้อยเพียงอย่างเดียวที่นี่คืออาจมีการเปลี่ยนเส้นทาง (สูงสุด) 2 ครั้ง อันดับแรก 301 ถึง www+HTTPS บนเส้นทาง URL ดั้งเดิม และ 302 ที่สองไปที่หน้า "เร็ว ๆ นี้"
ฉันจะถามว่าคุณต้องการเปลี่ยนเส้นทาง 301 เริ่มต้นไปที่ www+HTTPS หรือไม่ เมื่อคุณเปลี่ยนเส้นทางผู้ใช้ไปยัง ชั่วคราว หน้า "เร็ว ๆ นี้"เมื่อคุณติดตั้งไซต์ใหม่แล้ว (แทนที่หน้า "เร็ว ๆ นี้") คุณจะใช้การเปลี่ยนเส้นทางตามรูปแบบบัญญัติ การเปลี่ยนเส้นทาง 302 ยังคงสามารถเปลี่ยนเส้นทางไปที่ www+HTTPS (อย่างไรก็ตาม มีกรณีขอบเมื่อ /coming-soon.html
โดยตรง)
ตัวอย่างเช่น:
# 302 เปลี่ยนเส้นทางไปยังหน้าเร็ว ๆ นี้ (www+HTTPS)
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$
RewriteRule !^coming-soon\.html$ https://www.%1/coming-soon.html [R=302,L]
#เคสขอบ...
# กฎสองข้อต่อไปนี้ใช้เฉพาะเมื่อมีการร้องขอ "/coming-soon.html" โดยตรงเท่านั้น
# และขอชื่อโฮสต์ที่ไม่ใช่ www และ/หรือ HTTP อย่างใดอย่างหนึ่ง
# ซึ่งในกรณีนี้ 301 เปลี่ยนเส้นทางไปที่ www+HTTPS
# โดเมนย่อย www หายไป...
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# มีการร้องขอ HTTP + www
RewriteCond ลด %{HTTPS}
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
คำขอใด ๆ สำหรับ http://example.com/foo
คือ 302 เปลี่ยนเส้นทางตรงไปที่ https://www.example.com/coming-soon.html
.
ถ้า http://example.com/coming-soon.html
ควรได้รับการร้องขอจากนั้นจึงเปลี่ยนเส้นทาง 301 ไปที่ https://www.example.com/coming-soon.html
(เพียงแค่แก้ไขโดเมนย่อย HTTPS และ www)
มีการเปลี่ยนเส้นทางภายนอกไม่เกิน 1 รายการเท่านั้น