Что действительно заменяется заменой в RewriteRule внутри файлов .htaccess? - PullRequest
1 голос
/ 09 февраля 2020

Я пытаюсь понять модуль перезаписи Apache. Документация в Документация директивы RewriteRule гласит:

Подстановка правила перезаписи - это строка, которая заменяет исходный URL-путь, которому соответствует Pattern.

Означает ли это, что полный URL-путь заменяется при совпадении или только часть, соответствующая регулярному выражению?

Например:

RewriteRule ^test new

Теперь я введите в мой браузер: http://example.com/test/file.php

test/file.php сопоставляется с ^test и подстановка new. Как будет выглядеть результат?

new/file.php или просто new?

Что именно здесь заменяется?

1 Ответ

0 голосов
/ 09 февраля 2020

"новый / файл. php" или просто "новый"?

просто "новый". Строка substitution заменяет URL-путь whole , если Pattern соответствует.

Чтобы получить результат new/file.php, запросив /test/file.php, вам понадобится немного другая директива. Например:

RewriteRule ^test/(.*) new/$1 [L]

ОБНОВЛЕНИЕ: Обратите внимание, что выше указано внутреннее переписывание (в отличие от внешнее перенаправление ). Перезапись является внутренней по отношению к серверу, пользователь не видит этого.

Также обратите внимание, что new/$1 - это относительный путь (в отличие от root -относительный - начиная с sla sh или абсолютный - со схемой + имя хоста).

Если файл .htaccess находится в каталоге root, вам не нужно включать префикс sla sh (для внутреннее переписывание ), поскольку по умолчанию оно относится к каталогу, содержащему файл .htaccess. (Добавлять его без вреда.) * Префикс каталога (абсолютный путь к файловой системе, в котором находится файл .htaccess) добавляется в конце к относительным заменам пути. Таким образом, new/file.php фактически становится /path/to/root-directory/new/file.php (когда файл .htaccess находится в /path/to/root-directory/.htaccess).

Однако, если вы создаете внешнее перенаправление , вам потребуется префикс sla sh (чтобы сделать его root -относительным - относительно документа root) или установить директиву RewriteBase (которая переопределяет префикс каталога ). В противном случае вы бы получили перенаправление на http://example.com/path/to/root-directory/new/file.php, что, скорее всего, «неправильно».

Например:

RewriteRule ^test/(.*) /new/$1 [R,L]

Обратите внимание на флаг R, который вызывает внешнее перенаправление обратно к клиенту.

...