mod-rewrite可以用来设置环境variables吗?

我有一个现有的简单的重写规则,如下所示:

<Directory /path> RewriteEngine on RewriteBase / # if the requested resource does not exist RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # route the uri to a front controller RewriteRule ^(.*)$ index.php/$1 [L] </Directory> 

这工作正常,但我想做两件事情之一。 在检测客户端接受语言头的基础上,我也想

(i)将检测到的语言设置为脚本可以使用的环境variables

(ii)重写请求,使url以语言代码开始(例如www.example.com/en/some/resource)

在实施(i)方面,我定义了这个规则:

 <Directory /path> RewriteEngine on RewriteBase / # if the requested resource does not exist RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # if the users preferred language is supported... RewriteCond %{HTTP:Accept-Language} ^.*(de|es|fr|it|ja|ru|en).*$ [NC] # define an environmental variable PREFER_LANG RewriteRule ^(.*)$ - [env=PREFER_LANG:%1] # route the uri to a front controller RewriteRule ^(.*)$ index.php/$1 [L] </Directory> 

我已经尝试了一些变化,但PREFER_LANG未在$ _SERVER中定义,也未由getenv进行检索。

在实施(ii)方面…让我们只是说它的凌乱。 如果我找不到答案,我会发布。

任何人都可以提醒我吗? 谢谢!

当然可以使用mod_rewrite设置环境variables。 使用以下configuration:

 RewriteEngine on RewriteLog /var/log/httpd/rewrite.log RewriteLogLevel 5 # if the requested resource does not exist RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # if the users preferred language is supported... RewriteCond %{HTTP:Accept-Language} ^.*(de|es|fr|it|ja|ru|en).*$ [NC] # define an environmental variable PREFER_LANG RewriteRule ^(.*)$ - [env=PREFER_LANG:%1] # route the uri to a front controller RewriteRule ^(.*)$ /cgi-bin/serverfault.cgi?q=$1 [PT] 

其中serverfault.cgi只是一个调用env的shell脚本。 这工作得很好:

 $ curl -s -H 'Accept-language: de' http://localhost/serverfault/somefile | grep PREFER PREFER_LANG=de 

你的RewriteLog什么样的? 你应该看到这样的东西:

 init rewrite engine with requested uri /serverfault/foo.html applying pattern '^(.*)$' to uri '/serverfault/foo.html' RewriteCond: input='/serverfault/foo.html' pattern='!-f' => matched RewriteCond: input='/serverfault/foo.html' pattern='!-d' => matched RewriteCond: input='en-US,en;q=0.8' pattern='^.*(de|es|fr|it|ja|ru|en).*$' [NC] => matched setting env variable 'PREFER_LANG' to 'en' applying pattern '^(.*)$' to uri '/serverfault/foo.html' rewrite '/serverfault/foo.html' -> '/cgi-bin/serverfault.cgi?q=/serverfault/foo.html' split uri=/cgi-bin/serverfault.cgi?q=/serverfault/foo.html -> uri=/cgi-bin/serverfault.cgi, args=q=/serverfault/foo.html forcing '/cgi-bin/serverfault.cgi' to get passed through to next API URI-to-filename handler 

根据PHP手册的评论,这是可能的。 PHP是集成为模块还是CGI?