要应用于所有当前规则的全局规则

时间:2011-08-19 19:21:50

标签: apache mod-rewrite

我目前有一个非常简单的modrewrite文件,它将网址映射到具有可能的GET变量的不同php页面:

RewriteRule ^grant$ about.php?p=4 [L]
RewriteRule ^contact-people-([A-za-z0-9-]+)$ about.php?p=5&to=$1 [L]
RewriteRule ^([a-z0-9-]+)-media$ media-gallery-element.php?prettyid=$1 [L]
#etc .... it goes on for perhaps 200 or so entries

我想在网址中有一个全局语言变量,我想知道如何巧妙地调整我的modrewrite文件来处理这个问题。我可以通过加倍输入来添加更多规则,以便上面的第一个变为:

RewriteRule ^grant$ about.php?p=4&lan=en [L]
RewriteRule ^([a-z]+)/grant$ about.php?p=4&lan=$1 [L]

第一行是相同的,默认为english(en),然后第二行处理其他语言代码,es,fr,de等等所以我可以这样做,但似乎有一个更好的方法来做到这一点,而不是加倍我的条目。基本上,我想接受我的所有请求,在请求uri的开头查找([a-z] +)/,然后将其作为GET变量lan发送到请求中。

我如何巧妙地做到这一点?

1 个答案:

答案 0 :(得分:2)

您可以通过设置环境变量轻松完成此操作。这样的事情可以解决问题:

# set default environmental variable for language
RewriteRule .* - [E=language:en]

# if two characters and slash lead, then
RewriteCond %{REQUEST_URI} ^/([a-z]{2})/(.*)$     

# overwrite default environmental variable
RewriteRule .* - [E=language:%1] 

# other rules
RewriteRule ^grant$ about.php?p=4&lan=%{ENV:language} [L]

您也可以直接在PHP中访问环境变量,在这种情况下,您可以跳过将其包含在重写规则中:

echo getenv('language');
echo $_SERVER['language'];
echo $_SERVER['REDIRECT_language'];