.htaccess mod_rewrite - วิธีแยกไดเรกทอรีออกจากกฎการเขียนซ้ำ


145

ฉันมีกฎการเขียนใหม่ 8 บรรทัดในไฟล์. htaccess ของฉัน ฉันต้องยกเว้นไดเรกทอรีทางกายภาพสองไดเรกทอรีบนเซิร์ฟเวอร์ของฉันจากกฎเหล่านี้เพื่อให้สามารถเข้าถึงได้ ตอนนี้คำขอทั้งหมดจะถูกส่งไปยังไฟล์ index.php

ไดเรกทอรีที่จะยกเว้น: "ผู้ดูแลระบบ" และ "ผู้ใช้"

ดังนั้นคำขอ http: http://www.domain.com/admin/ไม่ควรส่งผ่านไปยังไฟล์ index.php

ErrorDocument 404 /index.php?mod=error404

Options  FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]

ฉันคิดว่าคุณลืมปริมาณหลังจากนั้น[^/]นับตั้งแต่พื้นที่ว่างเปล่าหากไม่ได้รับอนุญาตที่นั่น (มันจะต้องหลบหนีด้วย\<space>)
Gumbo

True Gumbo จับได้ดี :) ควรเป็น ^ ([^ /] +)
เคลวิน

คำตอบ:


287

ลองใช้กฎนี้ก่อนกฎอื่น ๆ ของคุณ:

RewriteRule ^(admin|user)($|/) - [L]

นี่จะสิ้นสุดกระบวนการเขียนใหม่


สวัสดี Gumbo รหัสของคุณใช้งานได้หากผู้ใช้พิมพ์ domain.com/admin/ (ที่มีเครื่องหมายทับ) แต่ไม่มีรหัส คุณสามารถเปลี่ยนแปลงอะไรได้บ้างเพื่อให้ทั้งสองกรณีทำงาน ขอบคุณ
Kelvin

@Kelvin: การสลับ($|/)ควรจัดการทั้งสองกรณี
Gumbo

การใช้ RewriteCond ที่นี่ดีกว่าการใช้ RewriteRule หรือไม่
rineez

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

3
@Ergec มันหมายถึง“ ไม่ต้องเปลี่ยนอะไรเลย”
Gumbo

112

สิ่งที่คุณสามารถทำได้คือใส่ไฟล์. htaccess ที่มี

RewriteEngine Off

ในโฟลเดอร์ที่คุณต้องการแยกออกจากการเขียนใหม่ (โดยกฎในไฟล์. htaccess ที่สูงกว่าต้นไม้) เรียบง่าย แต่มีประสิทธิภาพ


18
+1 ~ .htaccess ดำเนินการแบบลำดับชั้นดังนั้นโฟลเดอร์ในเครื่องจะแทนที่ผู้ปกครองเช่นเดียวกับการเรียงซ้อนตามปกติใน CSS หรือ MVC
อาตาริ

4
มีเพียงสิ่งเดียวที่คุณควรคำนึงถึง: การเปิดใช้งานไฟล์. htaccess (การตั้งค่าAllowOverrideเป็นอย่างอื่นที่ไม่ใช่Noneในการกำหนดค่าapache) จะบังคับให้ apache ค้นหา. htaccess ในทุกคำขอ ดังนั้นหากคุณมีเว็บไซต์ที่ดั้นด้นสูง / เว็บเซิร์ฟเวอร์ที่ระบบแฟ้ม / ฮาร์ดดิสก์เข้าถึงอาจมีผลกระทบต่อประสิทธิภาพ imense ...
bohrsty

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

25

เพิ่มเงื่อนไขเพื่อตรวจสอบไดเรกทอรีผู้ดูแลระบบเช่น:

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]

สวัสดี Rob ฉันใส่บรรทัดนี้หลังจาก "RewriteBase /" และตอนนี้ฉันได้รับ "500 ข้อผิดพลาด - ข้อผิดพลาดเซิร์ฟเวอร์ภายใน"
Kelvin

@Kelvin ฉันแก้ไขคำตอบของฉันเพิ่มเงื่อนไขก่อนแต่ละกฎที่คุณต้องการใช้กับ
Rob

อันนี้เป็นคนเดียวที่ช่วยฉันได้จริง คำตอบที่ได้รับการยอมรับก็ไม่ได้ช่วยให้ฉัน
Uwe Keim

5

หากคุณต้องการลบไดเรกทอรีเฉพาะจากกฎ (หมายถึงคุณต้องการลบไดเรกทอรีfoo ) คุณสามารถใช้:

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/foo/$
RewriteRule !index\.php$ /index.php [L]

RewriteRule ข้างต้นจะเขียน requestes ทั้งหมดเพื่อ/index.phpไม่รวมการร้องขอสำหรับ/ foo /

หากต้องการยกเว้นเส้นทางที่มีอยู่ทั้งหมดคุณจะต้องใช้เงื่อนไขต่อไปนี้เหนือกฎของคุณ:

RewriteCond %{REQUEST_FILENAME} !-d

กฎต่อไปนี้

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !index\.php$ /index.php [L]

ปรับเปลี่ยนทุกอย่าง (ยกเว้น directries) เพื่อ/index.php


5

เราใช้กฎ mod_rewrite ต่อไปนี้:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/test/
RewriteCond %{REQUEST_URI} !^/my-folder/
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]

นี่เป็นการเปลี่ยนเส้นทาง (เป็นการถาวรด้วยการเปลี่ยนเส้นทาง 301) การรับส่งข้อมูลทั้งหมดไปยังเว็บไซต์ไปที่http://www.newdomain.comยกเว้นการร้องขอไปยังทรัพยากรในไดเรกทอรี / test และ / my-folder เราโอนผู้ใช้ไปยังแหล่งข้อมูลที่แน่นอนที่พวกเขาร้องขอโดยใช้กลุ่มการจับ (. *) จากนั้นรวม $ 1 ใน URL ใหม่ ระวังช่องว่าง


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.