RewriteCond не берет обратную ссылку из RewriteRule
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 13.12.20 14:31
Оценка:
Хочу в .htaccess настроить перенаправление запросов к файлам, перемещенным из текущего каталога в его подкаталог. Обычно это делается с указанием абсолютного пути в RewriteRule, но мне это очень не нравится, поскольку при изменении структуры каталогов приходится менять все пути. Хочу сделать так, чтобы это работало из любого каталога, где лежит .htaccess, и вдобавок работало как на сайте (через доменное имя), так и на его локальной копии под виндовым Apache (через localhost).

Apache 2.4.38. В VirtualHost указано C:\Site. Запрос "http://localhost/base/testdir/test". В C:/Site/base/testdir лежит .htaccess:

RewriteCond "%{REQUEST_URI}" ^(.*)/$1
RewriteCond "%{REQUEST_FILENAME}" !-f
RewriteRule ^(test)$ %1/en/$1 [R=302,L]


В Regex Back-Reference Availability утверждается, что сперва анализируется Pattern в RewriteRule (это подтверждается порядком сообщений в логе), а затем обрабатываются RewriteCond, где можно использовать фрагменты Pattern из RewriteRule в виде $n. Но по логу видно, что $1 в RewriteCond не раскрывается:

strip per-dir prefix: C:/Site/base/testdir/test -> test
applying pattern '^(test)$' to uri 'test'
RewriteCond: input='/base/testdir/test' pattern='^(.*)/$1' => not-matched


То, что обработка доходит до RewriteCond, означает, что "test" подходит под выражение "^(test)$" (иначе RewriteCond не обрабатывается вообще).

Это у меня что-то не так, или Апач кривой?
apache rewriterule rewritecond .htaccess back-reference
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.