如何使用带有URL参数的SetEnv

时间:2009-08-14 21:04:05

标签: apache .htaccess mod-rewrite cookies apache2

我正在尝试在.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

2 个答案:

答案 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>