Apache: Наследование правил перезаписи и определение переменные

У меня есть много типичных разделов 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>

, но ничего из этого не работает. Есть ли какое-либо решение для решения этой проблемы?

1
задан 13 November 2020 в 11:39
1 ответ

Ваша вторая версия может работать, если вы используете 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>
0
ответ дан 13 November 2020 в 10:44

Теги

Похожие вопросы