Что означает:$1 в htaccess?

Я просматривал источник Symfony2 framework. В файле htaccess для их примера веб-сайта я нашел %{REQUEST_URI}:: записать следующим образом:

RewriteCond %{REQUEST_URI}:: ^(/.+)(.+)::$
RewriteRule ^(.*) - [E=BASE:%1]

комментарий выше этого правила объясняет

следующий перезаписывает все остальные запросы к переднему контроллеру. Условие гарантирует, что если вы используете псевдонимы Apache для массового виртуального хостинга, базовый путь будет добавлен, чтобы обеспечить правильное разрешение приложения.файл php; он будет работать в non-aliased окружающие среды также, обеспечивающ сейф, пригонки ОДН-размера все разрешение.

однако это не объясняет :: или ::.

являются ли они backreferences? Если нет, то кто они? Какова их цель?

2 ответов


я столкнулся почти с тем же файлом htaccess в моем проекте Zend, и вот мои мысли и надеюсь, что это поможет.

файл htaccess (находится в каталоге проекта Zend, такой же, как index.php) говорит

RewriteCond %{REQUEST_URI}:: ^(/.+)(.+)::$
RewriteRule ^(.*)$ - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]

предположим, что Zend установлен в http://mydomain.tld / zend (давайте назовем это yourdomain позже) и мы просим yourdomain/mycontroller/myaction

%{REQUEST_URI} будет /zend/mycontroller/myaction.

обратите внимание, что , который является образцом в RewriteRule директива в контексте htaccess [1], " первоначально будет сопоставлена с путем файловой системы, после удаления префикса, который привел сервер к текущему RewriteRule (например,app1/index.html или index.html в зависимости от того, где директивы определено)".

будет mycontroller/myaction.

и %{REQUEST_URI}:: будет /zend/mycontroller/myaction::mycontroller/myaction.

вышеуказанная строка будет сопоставлена с ^(/.+)(.+)::$. Заметить что для двух групп захвата в круглых скобках т. е.,(/.+)(.+) до :: многие комбинации могут совпадать. Например:

Группа 1: /z

Группа 2: end/mycontroller/myaction

или

Группа 1: /zend/mycontroller/myactio

Группа 2: n

и все, что между ними, является действительным совпадением. На самом деле, самым интересным было бы

Группа 1: /zend/

Группа 2: mycontroller/myaction

который (единственный случай, который) делает backreference (после ::) ко второй группе матч.

в этом случае /zend/ будет храниться в переменной среды BASE что первый RewriteRule делает. The %1 относится к первой согласованной строке в RewriteCond что это /zend/.

глядя на второе RewriteRule, понятно, зачем это нужно. As index.php можно найти только в /zend/index.php, мы нужно добавить /zend/ перед index.php.

здесь мы предполагаем использовать URL-путь в качестве замены для второго


на на %{REQUEST_URI}:: ссылается на согласованную строку RewriteRule директива, т. е. согласованная строка .* на ^(.*). Так что %{REQUEST_URI}:: расширяется до запрошенного пути URI, предоставленного пользователем, и текущего внутреннего пути URI и запроса, разделенных ::.

шаблон ^(/.+)(.+)::$ используется для поиска префикса (первая группа захвата), который делает оставшуюся часть соответствующей части за :: ( является обратной ссылкой на найденную строку из вторая группа захвата шаблона).

если такое совпадение найдено, префикс сохраняется в переменной окружения BASE ([E=BASE:%1], где %1 ссылается на согласованную строку предыдущего успешного RewriteCond соответствие шаблону).