วิธีการยกเว้น URL เฉพาะใน .htaccess

การจัดการการเปลี่ยนเส้นทาง URL อย่างมีประสิทธิภาพเป็นสิ่งสำคัญสำหรับแอปพลิเคชันเว็บใดๆ โดยเฉพาะสำหรับที่สร้างบนเฟรมเวิร์กอย่าง CakePHP อย่างไรก็ตาม อาจมีกรณีที่คุณต้องการให้ไดเร็กทอรีหรือ URL บางรายการ ไม่ ถูกส่งผลกระทบจากกฎการเปลี่ยนเส้นทางของคุณ บล็อกนี้จะพาคุณไปผ่านกระบวนการตั้งค่าไฟล์ .htaccess ของคุณเพื่อยกเว้น URL เฉพาะจากการถูกเปลี่ยนเส้นทาง นี่คือวิธีการทำอย่างมีประสิทธิภาพ

เข้าใจปัญหา

เมื่อคุณกำหนดค่าไฟล์ .htaccess ของคุณ ปกติแล้วคุณจะตั้งค่าคำสั่งเพื่อจัดการว่าควรเขียน URL ใหม่อย่างไร สำหรับตัวอย่างในการตั้งค่า CakePHP โดยทั่วไป คำขอที่เข้ามาทั้งหมดไปยังแอปพลิเคชันของคุณจะถูกส่งไปยัง app/webroot/index.php ซึ่งจะตัดสินใจว่า UI คอนโทรลเลอร์และฟังก์ชันใดที่จะถูกเรียกใช้งาน อย่างไรก็ตาม สิ่งนี้อาจสร้างปัญหาถ้าคุณมีทรัพยากรสแตติกหรือไดเร็กทอรีอื่น ๆ ที่คุณไม่ต้องการให้ประมวลผลในลักษณะนี้

ตัวอย่างเช่น ถ้าโครงสร้างไฟล์ของคุณรวมถึง:

/appRoot/.htaccess
         app/
         static/

ด้วยกฎพื้นฐานแบบนี้:

RewriteBase /appRoot

RewriteRule ^$ app/webroot/     [L]
RewriteRule (.*) app/webroot/$1 [L]

คำขอทั้งหมดไปยัง /appRoot/* จะถูกนำไปยัง app/webroot/index.php ซึ่งไม่เป็นที่ต้องการเสมอไป คุณอาจต้องการยกเว้นโฟลเดอร์เช่น static/ จากการถูกเขียนใหม่

วิธีการทั่วไปในการยกเว้น URL

วิธีหนึ่งในการทำเช่นนี้อาจเกี่ยวข้องกับบรรทัดต่อไปนี้ในไฟล์ .htaccess ของคุณ:

RewriteCond $1 ^(static|otherDir).*$ [NC]
RewriteRule (.*) - [L]

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

วิธีแก้ปัญหา: การแก้ไขกฎการเขียนใหม่

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

ขั้นตอนที่ 1: ยกเว้นไดเร็กทอรีเฉพาะ

คุณสามารถใช้กฎเช่นต่อไปนี้เพื่อยกเว้นไดเร็กทอรีได้อย่างถูกต้อง:

RewriteRule   ^(static|otherDir).* - [NC,L]

ขั้นตอนที่ 2: ให้แน่ใจว่าคำขออื่น ๆ ถูกจัดการโดย CakePHP

เมื่อทำการยกเว้นนี้เรียบร้อยแล้ว คุณสามารถเปลี่ยนเส้นทางคำขออื่น ๆ ทั้งหมดไปยังแอปพลิเคชัน CakePHP ของคุณได้อย่างปลอดภัยเช่นนี้:

# คำขออื่น ๆ จะถูกส่งไปที่ Cake
RewriteRule   ^$   app/webroot/   [L]
RewriteRule   (.*) app/webroot/$1 [L]

ตัวอย่างการกำหนดค่าที่สมบูรณ์ใน .htaccess

นี่คือสิ่งที่การกำหนดค่าที่สุดท้ายอาจมีลักษณะในไฟล์ .htaccess ของคุณ:

RewriteEngine On

# ยกเว้นไดเร็กทอรีเฉพาะจากการถูกเขียนใหม่
RewriteRule   ^(static|otherDir).* - [NC,L]

# จัดการการเปลี่ยนเส้นทางคำขออื่น ๆ ไปยังแอป CakePHP
RewriteRule   ^$   app/webroot/   [L]
RewriteRule   (.*) app/webroot/$1 [L]

บทสรุป

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

ด้วยกฎที่ปรับแต่งเหล่านี้ แอปพลิเคชัน CakePHP ของคุณควรจะสามารถจัดการไดเร็กทอรีเฉพาะได้อย่างถูกต้องโดยไม่มีการเปลี่ยนเส้นทางที่ไม่ตั้งใจ