我正在尝试在.htaccess中实现语言切换,现在唯一剩下的就是处理不支持cookie的客户端。为此,我必须在用户点击带有language
参数的链接时设置prefer-language
。
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} (?:^|&)language=(en|fr|no)
RewriteRule ^(.*)$ $1? [cookie=language:%1:.example.com,env=language:%1,R]
SetEnv prefer-language $language
问题出在最后一行 - 该值始终设置为空。如果我硬编码它会起作用,但如果我尝试引用变量则不行。在此上下文中是否有一些特殊的语法来引用环境变量,还是有其他方法来设置prefer-language
?
修改:交叉发布到Apache users list。
答案 0 :(得分:7)
您也可以使用mod_rewrite设置环境变量。实际上,你已经这样做了(见env
/E
flag)。
我自己无法使用mod_negotiation对其进行测试,但以下内容应该可以正常运行并设置prefer-language
:
RewriteCond %{QUERY_STRING} ^((?:[^&]&)*)language=(en|fr|no)&?([^&].*)?$
RewriteRule ^ %{REQUEST_URI}?%1%3 [L,CO=language:%2,R]
RewriteCond %{HTTP_COOKIE} (^|[,\s])language=([^\s,;]+)
RewriteRule ^ - [L,E=prefer-language:%2]
SetEnvIf REDIRECT_prefer-language (.+) prefer-language=$1
但如果您将语言标识符放入/en/…
这样的网址路径中会更容易:
SetEnvIf Request_URI ^/(en|fr|no)/ prefer-language=$1
SetEnvIf REDIRECT_prefer-language (.+) prefer-language=$1
我不知道您是否需要额外/秒SetEnvIf
变量。
答案 1 :(得分:1)
看起来SetEnv中没有对变量的支持,但如果其他人试图这样做,这里的工作配置也是如此。这是一种更简单的语言选择,因为它只是将language
参数从引用者复制到当前URL(如果它没有改变):
RewriteEngine On
RewriteBase /
# Keep the language parameter if specified in the last URL
RewriteCond %{HTTP_REFERER} ^(?:.*[&?])?language=(en|fr|no).*$
RewriteCond %{QUERY_STRING} !^(?:.*&)?language=(en|fr|no).*$
RewriteRule ^(.*)$ $1?language=%1 [redirect=permanent]
# Set the language from the URL parameter
RewriteCond %{QUERY_STRING} ^(?:.*&)?language=(en|fr|no).*$
RewriteRule ^ - [env=prefer-language:%1]
# Cache only when the language parameter is set
<IfDefine !prefer-language>
Header set Vary *
</IfDefine>