Tidak dapat menemukan aturan htaccess

9

Saya memiliki ini di htaccess saya tetapi tidak tahu untuk apa ini. Karena sifat aturan, pencarian juga tidak membantu.

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

Adakah yang bisa menjelaskan untuk apa?

Richard1984
sumber
Jika bagian permintaan (bagian dari URL setelah ".com") tidak berakhir dengan a /dan itu tidak mengandung " .", maka arahkan permintaan dengan menambahkannya dengan a /. Maksud yang mungkin dari aturan ini adalah untuk menangani pengindeksan direktori otomatis.
peterh

Jawaban:

11

Semua aturan ini adalah menambahkan trailing /ke URL Anda jika tidak ada dan jika tidak ada .di URI, jadi https://example.org/testakan diarahkan ke https://example.org/test/, tetapi https://example.org/test.htmltidak akan ditulis ulang ke https://example.org/test.html/(tetapi catatan: https://example.org/test.case/folderjuga tidak akan diarahkan ke https://example.org/test.case/folder/karena mengandung a .di 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]
Sven
sumber
" /test.case/folderjuga tidak akan dialihkan" - Minor point, tetapi jika "folder" adalah direktori filesystem, maka mod_dir akan (secara default) mengeluarkan 301 redirect untuk menambahkan trailing slash. Ini hanya masalah jika itu /test.case/some-other-virtual-urlyang seharusnya memiliki garis miring.
MrWhite
6

Tanpa memvalidasi, tetapi menggunakan pengalaman saya dalam penulisan ulang Apache, konfigurasi ini tampaknya:

  1. Cocokkan dengan bagian 'jalur' pada URI (bukan parameter server, port, atau kueri), misalnya '/my/location/file.html'.
  2. Cocokkan jika bagian ini tidak berakhir pada karakter '/' (garis miring), -atau- tidak termasuk '.' (dot) karakter.
  3. Gunakan bagian path lengkap dari URI dan tambahkan garis miring ke depan.
  4. Kirim pengalihan HTTP 301 (permanen) untuk mengarahkan browser ke URI baru ini.

Ini akan menghasilkan kasus uji berikut

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

Jadi saya pikir aturan memiliki tujuan menambahkan garis miring ke sumber daya yang tampaknya bukan file, tetapi tampaknya memiliki kasus tepi.

Jika tidak menambahkan garis miring ke sumber daya dengan '.' (dot) karakter di bagian non-file dari path ekspresi reguler harus diubah menjadi:

# 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]
Joffrey
sumber
!(\/$|\.[^\/]*)- Regex Anda yang diperbarui benar-benar tidak berbeda. Anda membutuhkan jangkar ujung senar pada bagian ke-2 (yang cocok dengan ekstensi) juga. Mungkin sesuatu seperti: !(/|\.[a-zA-Z]+)$(tidak perlu lepas dari garis miring).
MrWhite
@ MrWhite Tangkapan bagus! Saya memperbarui jawaban saya!
Joffrey