我有一个现有的简单的重写规则,如下所示:
<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?