使用Request_URI的Apache2 SetEnvIfNoCase

时间:2013-09-04 10:43:43

标签: php regex apache2

我正在尝试在apache服务器上的VHost中设置语言环境变量,以便请求的路径将定义使用的语言环境。 要求是使用更“消费者友好”的区域代码,而不是ISO格式 - 但我们需要将它们映射到框架中支持的ISO格式。

例如: http://site.com/uk/path/to/page.html会将环境变量设置为REQ_LOCALE=en_GB

如果找到意外的语言环境,我们希望将其默认为美国英语。

我现在尝试使用的是这种方式的apache SetEnvIfNoCase指令:

SetEnvIfNoCase Request_URI     ^/eu     REQ_LOCALE=en_US
SetEnvIfNoCase Request_URI     ^/es     REQ_LOCALE=es_ES
SetEnvIfNoCase Request_URI     ^/de     REQ_LOCALE=de_DE
SetEnvIfNoCase Request_URI     ^/fr     REQ_LOCALE=fr_FR
SetEnvIfNoCase Request_URI     ^/it     REQ_LOCALE=it_IT
SetEnvIfNoCase Request_URI     ^/uk     REQ_LOCALE=en_GB
SetEnvIf REQ_LOCALE      ^$       REQ_LOCALE=en_US

由于某种原因,只调用最后一个指令。但是,如果我从正则表达式中移除^/,则de

所以......我现在有点不知所措:)

有人可以帮忙吗? (注意:我尝试使用REQUEST_URI以及Request_URI - 结果没有变化)

修改 我认为以下重写规则可能导致我的问题:

RewriteRule .* index.php [L]

查看重写代码 - 似乎这会导致重定向,并且环境变量未被传输。 所以......

1 个答案:

答案 0 :(得分:1)

像这样使用:

# initialize the env var to en_US
SetEnvIfNoCase Request_URI     "^"     REQ_LOCALE=en_US

# now set it conditionally
SetEnvIfNoCase Request_URI     "^/eu"  REQ_LOCALE=en_US
SetEnvIfNoCase Request_URI     "^/es"  REQ_LOCALE=es_ES
SetEnvIfNoCase Request_URI     "^/de"  REQ_LOCALE=de_DE
SetEnvIfNoCase Request_URI     "^/fr"  REQ_LOCALE=fr_FR
SetEnvIfNoCase Request_URI     "^/it"  REQ_LOCALE=it_IT
SetEnvIfNoCase Request_URI     "^/uk"  REQ_LOCALE=en_GB

编辑:您可以将重写规则更改为:

RewriteCond %{QUERY_STRING} ^$
RewriteRule ^ index.php?lc=%{ENV:REQ_LOCALE} [L,QSA]