วิธีการยกเว้น 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 ของคุณควรจะสามารถจัดการไดเร็กทอรีเฉพาะได้อย่างถูกต้องโดยไม่มีการเปลี่ยนเส้นทางที่ไม่ตั้งใจ