У меня есть много типичных разделов vhosts, которые отличаются одним или двумя параметрами в правилах mod_rewrite, например:
httpd -vhosts.conf
<VirtualHost *>
RewriteRule someurl/(.*)\.html /var/www/somepath1/file.$1.html [L]
...
</VirtualHost>
<VirtualHost *>
RewriteRule someurl/(.*)\.html /var/www/somepath2/file.$1.html [L]
...
</VirtualHost>
...
Я нашел опцию InheritBefore в Apache 2.4, так что теперь я могу делать вот так:
httpd.conf
RewriteRule someurl/(.*)\.html /var/www/somepath/file.$1.html [L]
httpd-vhosts.conf
<VirtualHost *>
RewriteOptions InheritBefore
...
</VirtualHost>
<VirtualHost *>
RewriteOptions InheritBefore
...
</VirtualHost>
...
Выглядит больше кратко, но есть проблема. Мне нужно изменить somepath в базовом правиле на некоторую переменную. Я пробовал вот так:
RewriteRule someurl/(.*)\.html /var/www/${somepath}/file.$1.html [L]
<VirtualHost *>
Define somepath somepath1
RewriteOptions InheritBefore
...
</VirtualHost>
или
RewriteRule someurl/(.*)\.html /var/www/%{ENV:somepath}/file.$1.html [L]
<VirtualHost *>
Define somepath somepath1
RewriteOptions InheritBefore
RewriteRule . - [E=somepath:somepath1]
...
</VirtualHost>
, но ничего из этого не работает. Есть ли какое-либо решение для решения этой проблемы?
Ваша вторая версия может работать, если вы используете SetEnv
вместо Define
:
RewriteRule someurl/(.*)\.html /var/www/%{ENV:somepath}/file.$1.html [L]
<VirtualHost *>
SetEnv somepath somepath1
RewriteOptions InheritBefore
...
</VirtualHost>
Или иногда вам нужно использовать SetEnvIf
вместо SetEnv
, так как SetEnvIf
обрабатывается раньше. Например:
SetEnvIf Request_URI . somepath=somepath1
В противном случае вы могли бы использовать mod_macro:
<Macro rewrite $path>
RewriteRule someurl/(.*)\.html /var/www/$path/file.$1.html [L]
</Macro>
<Virtualhost *>
Use rewrite somepath1
</Virtualhost>