Что означает:$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
соответствие шаблону).