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

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

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

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

9
задан 23 February 2019 в 12:02
2 ответа

Все, что делает это правило, - это добавление конечных / к вашим 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]
11
ответ дан 2 December 2019 в 22:25

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

  1. Сопоставляет часть «путь» URI (не сервер, порт или параметры запроса), например '/my/location/file.html'.
  2. Соответствует, если эта часть не заканчивается символом '/' (косая черта), -или- не включает '.' (точка).
  3. Используйте часть полного пути URI и добавьте к нему косую черту.
  4. Отправьте HTTP 301 (постоянное) перенаправление, чтобы направить браузер на этот новый URI.

Это приведет к результат в следующих тестовых случаях

/ -> / / тест -> / тест / / мой / ресурс -> / мой / ресурс / /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]
6
ответ дан 2 December 2019 в 22:25

Теги

Похожие вопросы