ฉันค้นหาบทความมากมายบนอินเทอร์เน็ต แต่ไม่สามารถใช้งานได้
อาจเป็นเพราะนี่เป็นข้อกำหนดที่แปลกประหลาด ฉันจะแปลกใจถ้าคุณจะพบรหัสใด ๆ ที่คุณสามารถคัดลอก / วางที่ทำสิ่งนี้ได้
อย่างไรก็ตาม สมมติว่าคุณกำลังสร้าง URL แบบสัมบูรณ์ที่ถูกต้องสำหรับลิงก์ภายในทั้งหมดของคุณ (เนื่องจากคุณต้องไม่ลิงก์ภายในไปยัง URL ที่เปลี่ยนเส้นทาง) สิ่งนี้จึงค่อนข้างเล็กน้อยที่จะนำไปใช้ใน .htaccess
หากคุณเข้าใจคำสั่งที่มีอยู่ของคุณ
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
regex .*
ใน เขียนกฎใหม่
ลวดลาย การแข่งขัน ทุกอย่าง. โดยเฉพาะอย่างยิ่ง มันตรงกับ 0 หรือมากกว่าของอักขระใด ๆ ตามที่แสดงโดย *
ปริมาณ ซึ่งตรงกับเส้นทาง URL ที่ว่างเปล่า (เช่น "หน้าแรก") และทุกเส้นทาง URL ที่ไม่ว่างเปล่า (เช่น อย่างอื่นทั้งหมด)
คุณต้องแก้ไข regex ด้านบนเพื่อให้ตรงกับเส้นทาง URL ที่ไม่ว่างเปล่า (เช่น ทุกอย่างยกเว้นหน้าแรก) และสร้างกฎอีกข้อ (ในทิศทางอื่น) ที่ตรงกับเส้นทาง URL ที่ว่างเปล่าเท่านั้น
(สิ่งนี้ใช้ความจริงที่ว่า mod_dir กำลังให้บริการ index.php
สำหรับการร้องขอไปยังหน้าแรก ไม่ใช่คำสั่ง mod_rewrite ที่ตามมา)
หากต้องการจับคู่ 1 รายการขึ้นไป (เช่น เส้นทาง URL ที่ไม่ว่างเปล่า) คุณสามารถใช้ +
(บวก) ปริมาณ แทน *
(ดาว/ดอกจัน).
ตัวอย่างเช่น:
# เปลี่ยนเส้นทางทุกอย่างยกเว้นหน้าแรก (จาก www เป็น non-www)
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.+)$ https://example.com/$1 [L,R=301]
# เปลี่ยนเส้นทางหน้าแรกเท่านั้น (จากไม่มี www เป็น www)
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^$ https://www.example.com/ [L,R=301]
คุณจะต้องล้างแคชของเบราว์เซอร์ก่อนทำการทดสอบ เนื่องจากการเปลี่ยนเส้นทาง 301 (ถาวร) ก่อนหน้านี้ที่เปลี่ยนเส้นทางหน้าแรกจาก www เป็นไม่มี www จะถูกแคชโดยเบราว์เซอร์
ทดสอบครั้งแรกกับการเปลี่ยนเส้นทาง 302 (ชั่วคราว) เพื่อหลีกเลี่ยงปัญหาการแคชที่อาจเกิดขึ้น