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