ขึ้นอยู่กับว่าอยู่ส่วนไหนของ <VirtualHost> คอนเทนเนอร์ที่คุณกำลังวางคำสั่งเหล่านี้
หากคุณกำลังใช้ <Directory> คอนเทนเนอร์ (เช่น ก ไดเรกทอรี บริบท) และ ปิดการใช้งาน .htaccess แทนที่ทั้งหมด (มิฉะนั้น .htaccess จะแทนที่ <Directory> คอนเทนเนอร์!) จากนั้นคุณสามารถคัดลอกคำสั่งได้ตามที่เป็นอยู่ (สมมติว่าไฟล์ <Directory> คอนเทนเนอร์อ้างอิงไดเร็กทอรีเดียวกันกับ .htaccess ไฟล์ได้)
อย่างไรก็ตาม หากคุณใส่คำสั่งเหล่านี้โดยตรงใน <VirtualHost> ตู้คอนเทนเนอร์ (นอกก <Directory> ตู้คอนเทนเนอร์) กล่าวคือ ใน โฮสต์เสมือน บริบท คุณต้องทำการเปลี่ยนแปลงบางอย่าง เนื่องจากคำสั่งได้รับการประมวลผลก่อนหน้านี้ ก่อนที่คำขอจะถูกแมปกับระบบไฟล์
ในคำสั่งที่คุณโพสต์ จำเป็นต้องทำการเปลี่ยนแปลงเพียงสองอย่างเท่านั้น:
ใน โฮสต์เสมือน บริบท, REQUEST_FILENAME ตัวแปรเซิร์ฟเวอร์ยังไม่ได้รับการแก้ไขเป็น ชื่อไฟล์. ก็เหมือนกับ REQUEST_URI (เช่น URL ที่ร้องขอ) ดังนั้น การตรวจสอบระบบไฟล์ของคุณจะล้มเหลวเสมอ และเงื่อนไขจะสำเร็จเสมอ! คุณต้องใช้การมองไปข้างหน้า เช่น. %{LA-U:REQUEST_FILENAME}หรือสร้างชื่อไฟล์ที่สมบูรณ์ด้วยตัวคุณเอง เช่น. %{DOCUMENT_ROOT}%{REQUEST_URI}. ตัวอย่างเช่น:
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
ใน โฮสต์เสมือน บริบท เส้นทาง URL ที่จับคู่โดย เขียนกฎใหม่ ลวดลาย เป็นญาติราก (เริ่มต้นด้วยเครื่องหมายทับ) ในขณะที่ .htaccess มันสัมพันธ์กับไดเร็กทอรีที่มีไฟล์ .htaccess ไฟล์ - น้อยกว่าคำนำหน้าเครื่องหมายทับ ดังนั้น กฎตามที่เขียนจะส่งผลให้มีเครื่องหมายทับสองครั้งที่จุดเริ่มต้นของเส้นทาง URL ควรเขียนใหม่ดังนี้:
RewriteRule ^/(.*)$ /$1/ [R,L]
(เดอะ เอ็น.ซี ไม่จำเป็นต้องตั้งค่าสถานะที่นี่)
หรือ (ดีกว่า) อย่าใช้ backreference ที่นี่และใช้ REQUEST_URI ตัวแปรเซิร์ฟเวอร์แทน (ซึ่งจะทำงานใน .htaccess เช่นกัน). ตัวอย่างเช่น:
RewriteRule ^ %{REQUEST_URI}/ [R,L]
(นอกเหนือ: นี่น่าจะเป็นการเปลี่ยนเส้นทางถาวร 301 ด้วย (เช่น R=301). การดำเนินการนี้จะใช้ค่าเริ่มต้นเป็นการเปลี่ยนเส้นทางชั่วคราว 302 แต่ให้เปลี่ยนเป็น 301 เท่านั้น - หากนั่นคือความตั้งใจ - เมื่อคุณยืนยันว่าใช้งานได้ตามที่ตั้งใจไว้)
สรุปแล้วจะกลายเป็นว่า
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_URI} !^/application-module/(.*)$
RewriteCond %{REQUEST_URI} !(.*)json$ [NC]
RewriteCond %{REQUEST_URI} !playground/local-loader/(.*)$ [NC]
RewriteRule ^/(.*)$ /$1/ [R,L]
นอกเหนือ:
ข้างต้นสามารถเพิ่มประสิทธิภาพได้ทันทีโดยการย้ายการตรวจสอบระบบไฟล์ (ซึ่งค่อนข้าง แพง) ไปยังเงื่อนไขสุดท้ายและย้าย เงื่อนไข ที่ตรวจสอบว่าคำขอไม่ได้ลงท้ายด้วยเครื่องหมายทับไปที่ เขียนกฎใหม่ คำสั่ง นอกจากนี้ รูปแบบย่อย regex (.*) ในแต่ละ เงื่อนไข ไม่จำเป็น ดังนั้นจึงสามารถเขียนใหม่ได้อย่างมีประสิทธิภาพมากขึ้น:
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_URI} !^/application-module/
RewriteCond %{REQUEST_URI} !json$ [NC]
RewriteCond %{REQUEST_URI} !playground/local-loader/ [NC]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule !/$ %{REQUEST_URI}/ [R,L]
การตรวจสอบระบบไฟล์อาจถูกลบออกทั้งหมด หากคุณยกเว้นคำขอที่มี (หน้าตา) นามสกุลไฟล์แทน แต่สิ่งนี้อาจขึ้นอยู่กับโครงสร้างไฟล์ของคุณ
เดอะ เงื่อนไข ที่ตรวจสอบ !json$ ดูเหมือนว่ามันควรจะตรวจสอบสำหรับ .json นามสกุลไฟล์เช่น . !\.json$. (สิ่งนี้เชื่อมโยงกับความคิดเห็นของฉันด้านบนเกี่ยวกับการยกเว้น ทั้งหมด คำขอที่มี "นามสกุลไฟล์".)
ครั้งแรก เงื่อนไข การตรวจสอบว่าสตริงข้อความค้นหาว่างเปล่านั้นดูแปลก ๆ เล็กน้อย (เนื่องจากไม่สำคัญว่าจะมีสตริงข้อความค้นหาหรือไม่เมื่อต่อท้ายเครื่องหมายทับในเส้นทาง URL) แต่ฉันคิดว่านี่ต้องเป็นข้อกำหนดเฉพาะหรือไม่