2011-12-21 93 views
0

我有一个多语言站点,它使用cookie来存储语言信息。我需要编写一个.htaccess脚本根据cookie将语言添加到基于cookie的URI使用htaccess和基于URI设置cookie

a)检查是否设置了语言cookie,以及URI是否包含该脚本。如果没有,则将其添加到URI中。

现在我有这样的:

RewriteCond %{HTTP_COOKIE} language=([a-z]{2}) [NC] 
RewriteCond %{REQUEST_URI} !^%1/(.*) [NC] 
RewriteRule ^(.*)$ /%1/%2 [L,NC,R=302] 

虽然这给了我正确的URI(“domain.com/en/”),它给了我一个错误说的页面没有正确重定向。

b)检查URI中是否设置了语言参数,以及是否设置了适当的cookie。

到目前为止的代码因为这是我有:

RewriteRule ^([a-z]{2})(.*)/$ - [co=language:$1:.domain.com:7200:/] 

但是你离开页面后,这只设置cookie。所以我将不得不在地址中添加'/ fr /',然后刷新两次

我已经试过寻找谷歌和堆栈溢出,但我似乎无法得到这个工作!

回答

0

请求uri总是以/开头。 此外,%1只适用于最后的RewriteCond,所以我觉得你的代码应该是

RewriteCond %{HTTP_COOKIE} language=([a-z]{2}) [NC] 
RewriteCond %{REQUEST_URI} !^/(%1)/(.*) [NC] 
RewriteRule ^(.*)$ /%1/%2 [L,NC,R=302] 

该Cookie离开页面后,被设置似乎有些奇怪。 cookie在响应中设置,所以它只会出现在下一个请求的请求头中。不知道这是不是你的意思,但这是正常的行为。尝试在javascipt中检查document.cookie

编辑:上述代码不起作用。请参阅下面的我的更新版本。我在上面添加了你的cookie设置规则,并添加了L标志,以便它下面的规则在匹配时不会被执行,从而防止重定向的无限循环,这就是firefox意思是“不正确重定向”的意思。

RewriteRule ^([a-z]{2})(/.*)?$ - [co=language:$1:.domain.com:7200:/] 

RewriteRule ^([a-z]{2})(/.*)?$ - [L] 

RewriteCond %{HTTP_COOKIE} language=([a-z]{2}) [NC] 
RewriteRule ^(.*)$ /%1/$1 [L,NC,R=302] 
+0

我是新来的.htaccess - 我不知道%1只适用于最后一个RewriteCond,谢谢!我尝试了你的建议,但没有奏效。它附加了语言,但Firefox说这个页面没有正确重定向。 – Martin 2011-12-21 18:21:06

+0

我尝试了你的新建议,它仍然给我一个无限循环,并且uri变成http://domain.com/fr/fr/fr/fr/fr/fr/fr/fr/fr/fr/fr/ fr/fr/fr/fr/fr/fr/fr/fr/fr/ – Martin 2011-12-21 22:00:26

+0

如果我有Cookie,则重定向到domain.com/fr/404.shtml;如果我没有cookie并转到domain.com/fr/,那么它只会在第二次查看该页面时设置它。 – Martin 2011-12-22 15:27:30