Назад | Перейти на главную страницу

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

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

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

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

Все, что делает это правило, - добавляет конечный / к вашим 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]

Без проверки, но с учетом моего опыта переписывания Apache, эта конфигурация выглядит так:

  1. Соответствует части «путь» 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]