ไม่สามารถหากฎ htaccess


9

ฉันมีสิ่งนี้ใน htaccess ของฉัน แต่ไม่สามารถหาได้ว่ามันมีไว้เพื่ออะไร เนื่องจากลักษณะของกฎการค้นหาจึงไม่ได้ช่วยอะไรเช่นกัน

RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301]

ใครช่วยอธิบายหน่อยได้ไหม?


หากส่วนคำขอ (ส่วนหนึ่งของ URL หลัง ".com ') ที่ไม่ได้จบลงด้วย/และมันก็ไม่ได้มี' ." /แล้วเปลี่ยนเส้นทางการร้องขอโดยท้ายด้วย ความตั้งใจที่น่าจะเป็นของกฎนี้คือการจัดการการจัดทำดัชนีไดเรกทอรีอัตโนมัติ
peterh - Reinstate Monica

คำตอบ:


11

กฎทั้งหมดนี้คือการเพิ่มการต่อท้าย/URL ของคุณหากไม่มีและหากไม่มี.ใน URI ดังนั้นhttps://example.org/testจะถูกเปลี่ยนเส้นทางไปhttps://example.org/test/แต่https://example.org/test.htmlจะไม่ถูกเขียนใหม่ไปยังhttps://example.org/test.html/(แต่หมายเหตุ: https://example.org/test.case/folderจะไม่ถูกเปลี่ยนเส้นทางไปhttps://example.org/test.case/folder/ตามที่มี a .ใน URI)

## Do the following if the URI does not end with `/` or  does not contain an `.`: 
## the . is relevant for file names like test.html, which should n 
RewriteCond %{REQUEST_URI} !(/$|\.)

## Redirect it to the original URI with an added `/` and mark this as permanent:
RewriteRule (.*) %{REQUEST_URI}/ [R=301]

" /test.case/folderจะไม่ถูกเปลี่ยนเส้นทาง" - จุดเล็ก ๆ น้อย ๆ แต่ถ้า "โฟลเดอร์" เป็นไดเรกทอรีระบบแฟ้ม mod_dir จะออกค่าเริ่มต้น 301 ตามค่าเริ่มต้นเพื่อเปลี่ยนเครื่องหมายทับท้าย มันเป็นปัญหาถ้ามัน/test.case/some-other-virtual-urlควรจะมีเครื่องหมายทับ
MrWhite

6

โดยไม่ต้องตรวจสอบ แต่ใช้ประสบการณ์ของฉันใน Apache เขียนใหม่การกำหนดค่านี้ดูเหมือนว่า:

  1. จับคู่กับส่วน 'เส้นทาง' ของ URI (ไม่ใช่เซิร์ฟเวอร์พอร์ตหรือพารามิเตอร์การสืบค้น) ตัวอย่างเช่น '/my/location/file.html'
  2. จับคู่หากส่วนนี้ไม่ได้จบด้วยอักขระ '/' (ฟอร์เวิร์ดสแลช) - หรือ - ไม่รวม ' ตัวอักษร (จุด)
  3. ใช้ส่วนของพา ธ แบบเต็มของ URI และต่อท้ายสแลชต่อท้าย
  4. ส่งการเปลี่ยนเส้นทาง HTTP 301 (ถาวร) เพื่อนำเบราว์เซอร์ไปยัง URI ใหม่นี้

ซึ่งจะส่งผลให้กรณีทดสอบต่อไปนี้

/ -> / /test -> /test/ /my/resource -> /my/resource/ /my/resource.type -> /my/resource.type /edge.case/resource -> /edge.case/resource

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

หากไม่เพิ่มเครื่องหมายทับลงในทรัพยากรด้วย '.' อักขระ (จุด) ในส่วนที่ไม่ใช่ไฟล์ของพา ธ นิพจน์ทั่วไปควรเปลี่ยนเป็น:

# match paths which do not end with a slash, or do not resemble a file with an extension
RewriteCond %{REQUEST_URI} !(/$|\.[^/]+$)
# redirect permanently to the same uri with a slash
RewriteRule (.*) %{REQUEST_URI}/ [R=301]

!(\/$|\.[^\/]*)- regex ที่อัปเดตของคุณไม่แตกต่างกัน คุณต้องการจุดยึดจุดสิ้นสุดของส่วนที่ 2 (ที่ตรงกับส่วนขยาย) เช่นกัน อาจจะเป็นสิ่งที่ชอบ: !(/|\.[a-zA-Z]+)$(ไม่จำเป็นต้องหลบหลีกการทับ)
MrWhite

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