我有很多典型的 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>