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?
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?
Jawaban:
Semua aturan ini adalah menambahkan trailing /
ke URL Anda jika tidak ada dan jika tidak ada .
di URI, jadi https://example.org/test
akan diarahkan ke https://example.org/test/
, tetapi https://example.org/test.html
tidak akan ditulis ulang ke https://example.org/test.html/
(tetapi catatan: https://example.org/test.case/folder
juga 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]
/test.case/folder
juga 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-url
yang seharusnya memiliki garis miring.
Tanpa memvalidasi, tetapi menggunakan pengalaman saya dalam penulisan ulang Apache, konfigurasi ini tampaknya:
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]
!(\/$|\.[^\/]*)
- 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).
/
dan itu tidak mengandung ".
", maka arahkan permintaan dengan menambahkannya dengan a/
. Maksud yang mungkin dari aturan ini adalah untuk menangani pengindeksan direktori otomatis.