Не могу понять правило htaccess

9

У меня есть это в моем htaccess, но я не могу понять, для чего это нужно. Из-за природы правила поиск тоже не помогает.

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

Кто-нибудь может объяснить, для чего это нужно?

Richard1984
источник
Если часть запроса (часть URL после «.com») не заканчивается на « /а» и не содержит « .», то перенаправьте запрос, добавив его с « /. Вероятное намерение этого правила - обработать автоматическую индексацию каталога.
Петер - Восстановить Монику

Ответы:

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/поскольку содержит .в 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. Совпадение в части «path» 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]
Джоффри
источник
!(\/$|\.[^\/]*)- Ваше обновленное регулярное выражение действительно ничем не отличается. Вам также понадобится привязка конца строки во второй части (которая соответствует расширению). Возможно, что-то вроде: !(/|\.[a-zA-Z]+)$(не нужно избегать слэшей).
MrWhite
@MrWhite Хороший улов! Я обновил свой ответ!
Джоффри