ขึ้นอยู่กับว่าอยู่ส่วนไหนของ <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) แต่ฉันคิดว่านี่ต้องเป็นข้อกำหนดเฉพาะหรือไม่