Неможливо визначити правило htaccess


9

Я маю це у своєму htaccess, але не можу зрозуміти, для чого це потрібно. Через природу правила пошук також не допомагає.

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

Хто-небудь може пояснити, для чого це?


Якщо частина запиту (частина URL-адреси після ".com") не закінчується a /і не містить " .", то перенаправляйте запит, додавши його з a /. Ймовірним наміром цього правила є обробка автоматичної індексації каталогів.
peterh

Відповіді:


11

Все це правило полягає в тому, щоб додати /URL-адресу в останню 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. Збігайте, якщо ця частина не закінчується символом '/' (косою пересічкою), -or- не включає '.' (крапковий) символ.
  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]

!(\/$|\.[^\/]*)- Ваш оновлений регекс насправді не відрізняється. Вам також потрібен кінцевий якор на 2-й частині (що відповідає розширенню). Можливо, щось на кшталт: !(/|\.[a-zA-Z]+)$(не потрібно бігти від косих).
MrWhite

@MrWhite Хороший улов! Я оновив свою відповідь!
Джоффрі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.