Apache:继承重写规则和定义的变量

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>
...

我已经发现继承于Apache 2.4 中的选项,所以现在我可以这样做:

httpd配置文件

RewriteRule someurl/(.*)\.html /var/www/somepath/file.$1.html [L]

httpd-vhosts.conf

<VirtualHost *>
    RewriteOptions InheritBefore
    ...
</VirtualHost>
<VirtualHost *>
    RewriteOptions InheritBefore
    ...
</VirtualHost>
...

看起来更简洁,但有一个问题。我需要改变某某路径在基本规则中将变量设置为某个变量。我尝试过以下方法:

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

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>

相关内容