Bir htaccess kuralı bulunamıyor


9

Bu benim htaccess var ama bunun ne olduğunu anlayamıyorum. Kuralın doğası gereği arama da yardımcı olmaz.

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

Herkes bunun ne için açıklayabilir misiniz?


İstek kısmı (URL'nin ".com" dan sonraki kısmı) ile bitmiyorsa /ve " ." içermiyorsa , isteği a ile ekleyerek yeniden yönlendirin /. Bu kuralın muhtemel amacı, otomatik dizin indekslemeyi işlemektir.
peterh - Monica

Yanıtlar:


11

Bu kural Bütün yaptığı bir sondaki eklemektir /hiçbiri varsa sizin URL'lere ve hiçbir varsa .URI'de, böylece https://example.org/testyönlendirilecek https://example.org/test/, ancak https://example.org/test.htmliçin yeniden olmayacak https://example.org/test.html/(ancak not: https://example.org/test.case/folderayrıca edecek değil yönlendirilmek https://example.org/test.case/folder/içerdiği olarak bir .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/folderayrıca yeniden yönlendirilmez" - Küçük nokta, ancak "klasör" bir dosya sistemi dizini ise, mod_dir (varsayılan olarak) bir eğik çizgi eklemek için 301 yönlendirmesi yayınlar. Bu sadece bir /test.case/some-other-virtual-urleğik çizgi olması gerekiyorsa bir sorundur .
MrWhite

6

Doğrulamadan, ancak Apache yeniden yazma deneyimimi kullanarak, bu yapılandırma şöyle görünüyor:

  1. URI'nin 'sunucu' bağlantı noktasıyla (sunucu, bağlantı noktası veya sorgu parametreleri değil) eşleşir, örneğin '/my/location/file.html'.
  2. Bu bölüm bir '/' (eğik çizgi) karakteriyle bitmezse, -veya- bir 'içermez. (nokta) karakteri.
  3. URI'nin tam yol kısmını kullanın ve buna eğik çizgi ekleyin.
  4. Tarayıcıyı bu yeni URI'ye yönlendirmek için bir HTTP 301 (kalıcı) yönlendirmesi gönderin.

Bu aşağıdaki test durumlarıyla sonuçlanacaktır

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

Bu yüzden kuralın bir dosya gibi görünmeyen kaynaklara eğik çizgi eklemek için bir amacı olduğunu düşünüyorum, ancak bir kenar durumu var gibi görünüyor.

'.' İle bir kaynağa eğik çizgi eklemezseniz. yolun dosya olmayan kısmında (nokta) karakteri, normal ifadenin şu şekilde değiştirilmesi gerekir:

# 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]

!(\/$|\.[^\/]*)- Güncellenmiş normal ifadeniz gerçekten farklı değil. 2. kısımda (uzantıyla eşleşen) dize sonu bağlantısına da ihtiyacınız vardır. Belki şöyle bir şey: !(/|\.[a-zA-Z]+)$(eğik çizgilerden kaçmaya gerek yok).
MrWhite

@MrWhite İyi yakalama! Cevabımı güncelledim!
Joffrey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.