คำสั่งและลำดับความสำคัญของการดำเนินการ htaccess


19

ทุกคนสามารถอธิบายให้ฉันในสิ่งที่ apache สั่งรันไฟล์. htaccess อยู่ในระดับที่แตกต่างกันของเส้นทางเดียวกันและวิธีการเขียนกฎในนั้นจัดลำดับความสำคัญ?

ตัวอย่างเช่นทำไมกฎการเขียนซ้ำใน. htaccess ด้านล่างไม่ทำงานและเป็นกฎที่มีการ/blogจัดลำดับความสำคัญ

.htaccess ใน /

RewriteEngine on
RewriteBase /
RewriteRule ^blog offline.html [L]

.htaccess ใน /blog

RewriteEngine On
RewriteBase /blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]

PS: ฉันไม่เพียงแค่มองหาคำตอบ แต่สำหรับวิธีที่จะเข้าใจ apache / mod_rewrite internals ... ทำไมฉันถึงสำคัญกว่าวิธีการแก้ไขนี้

คำตอบ:


20

ฉันคิดว่าคุณควรอ่านApache Tutorial: .htaccessส่วนใหญ่เป็นหัวข้อ "วิธีการใช้คำสั่ง" ซึ่งระบุว่า:

คำสั่งการกำหนดค่าที่พบในไฟล์. htaccess จะนำไปใช้กับไดเรกทอรีที่พบไฟล์. htaccess และไดเรกทอรีย่อยทั้งหมด อย่างไรก็ตามสิ่งสำคัญคือต้องจำไว้ว่าอาจมีไฟล์. htaccess ในไดเรกทอรีที่สูงขึ้น มีการใช้คำสั่งตามลำดับที่พบ ดังนั้นไฟล์. htaccess ในไดเรกทอรีเฉพาะอาจแทนที่คำสั่งที่พบในไฟล์. htaccess ที่พบสูงกว่าในแผนผังไดเรกทอรี และในทางกลับกันอาจมีคำสั่งแทนที่พบว่ายังสูงขึ้นหรือในไฟล์กำหนดค่าเซิร์ฟเวอร์หลักเอง

ให้มันอ่านเต็มและ. htaccess จะไม่มีความลึกลับอีกต่อไป


7
mod_rewrite เป็นกรณีพิเศษ กฎการเขียนซ้ำจะใช้จากล่างขึ้นบน อันดับแรกกฎในไดเรกทอรีย่อยจากนั้นกฎในไดเรกทอรีหลัก
GetFree

เอกสารที่ปรากฏด้านบนใช้สำหรับ Apache 2.2 สำหรับ apache เวอร์ชันปัจจุบันไปที่ลิงค์นี้แทนhttpd.apache.org/docs/current/howto/htaccess.html
SherylHohman

3

คุณสามารถใช้RewriteOptions inheritเพื่อสืบทอดกฎการเขียนซ้ำของไดเร็กทอรีพาเรนต์ อย่างไรก็ตามกฎการเขียนซ้ำของไดเรกทอรีหลักจะถูกนำมาใช้ในภายหลังตามเอกสารใน RewriteOptions


1
คำสั่งเขียนซ้ำสำหรับไดเรกทอรีหลักจะถูกนำมาใช้แม้จะไม่มีคำสั่งนี้ (ซึ่งค่อนข้างสับสน) แต่ฉันคิดว่าสิ่งนี้สามารถใช้ในการดำเนินการคัดลอกเสมือน + วางคำสั่งจากผู้ปกครองไปยังเด็ก (ซึ่งอาจมีฐานเขียนที่แตกต่างกัน) ไม่น่าแปลกใจที่ mod_rewrite สับสนกับหัวของคุณในบางครั้ง ...
Simon East

2
@SimonEast "คำสั่งเขียนซ้ำสำหรับไดเรกทอรีหลักจะถูกใช้แม้จะไม่มีข้อความนี้" - คุณแน่ใจนะ? คุณมีข้อมูลอ้างอิงหรือไม่? โดยเฉพาะmod_rewriteคำสั่งจะไม่สืบทอดตามค่าเริ่มต้น (แตกต่างจากโมดูลอื่น ๆ ) คุณจะต้องมีRewriteOptions InheritXXXXคำสั่งบางแห่งเพื่อให้คำสั่งได้รับการสืบทอด อย่างไรก็ตามสิ่งนี้มีความซับซ้อนมากขึ้นบน Apache 2.4+ โดยมีInheritDownตัวเลือกที่สามารถระบุได้ในไดเรกทอรีหลักและการกำหนดค่าเซิร์ฟเวอร์ซึ่งจะควบคุมไดเรกทอรีลูก
MrWhite
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.