在.htaccess中使用自定义环境变量

时间:2010-09-02 13:12:42

标签: .htaccess mod-rewrite environment-variables

我需要这样的东西:

SetEnv foo bar.baz
RewriteEngine On

RewriteCond %{HTTP_HOST} ^%{foo}$
RewriteRule ^(.*)$ http://www.foo/$1 [L]

UPD:

我做了如下:

SetEnv HOSTNAME_ENV testsite
RewriteEngine On
RewriteCond %{HTTP_HOST} ^%{ENV:HOSTNAME_ENV}
RewriteRule ^(.*)$ http://www.%{ENV:HOSTNAME_ENV}/$1 [L,R=301]

但它不起作用。 <%:ENV:HOSTNAME_ENV}未定义。

2 个答案:

答案 0 :(得分:4)

这不起作用,因为mod_rewrite不会在测试模式中扩展变量。因此,您的表达式将尝试匹配正则表达式^%{foo}$,而不是^value_of_foo$

此外,SetEnv的文档还特别说明了与mod_rewrite的关系中的处理顺序。这实际上确实在这里发挥作用,尽管规则在请求处理中稍后应用,而不是他们在那里描述的场景。如果在针对您设置的环境变量进行测试之前未执行导致内部重定向的重写,则它将为空白。

假设你正确设置变量,一个潜在的解决方法就是这样做,虽然我觉得它不是万无一失的:

RewriteCond %{HTTP_HOST}#%{ENV:foo} ^([^#]+)#\1$

答案 1 :(得分:1)

只需使用重写规则设置环境:

RewriteRule (.*) $1 [E=HOSTNAME_ENV:whatever.com]

这也有一个好处,就是你可以使用RewriteCond。