Nginx位置指令,用于将url中的语言环境转换为查询字符串

时间:2013-01-28 10:47:10

标签: nginx

我想重写所有网址:

http://example.com/en/foo
http://example.com/en

为:

http://example.com/foo?locale=en
http://example.com?locale=en

我尝试过这样的事情(没有成功):

location ~ ^/([a-z]2)?/(.*)$ {
    rewrite ^([a-z]2)/(.*) /$2?locale=$1;
} 

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:0)

试试这个:

location ~ ^/([a-z]{2})(/.*){0,1} {
   rewrite ^/[a-z]{2}$ /?locale=$1 break;
   rewrite ^/[a-z]{2}/(.*)$ /$2?locale=$1 break;

location / {
    # I don't know what happend to your request after rewrite above
    # so I assume that you proxy pass it
    proxy_pass http://my.php.server/$uri?$query_string =404;
}

此处,您的示例都匹配第一个location模式。在此块内,请求的URL与不同的模式匹配。
如果第一个模式匹配,则采用第二个示例。
如果第二个模式匹配,那么你的第一个例子就是。

第二个location块用作在末尾尝试,这里你的重写网址来了,它们只是按原样使用。我们在这里使用$uri因为$request_uri值是不可变的。第一个位置阻止后参数$uri的值将更改为/?locale=en/foo?locale=en。它不包含查询字符串,因此我们必须使用变量$query_string进行mannualy协助。

答案 1 :(得分:0)

location / {
    rewrite "^/([a-z]{2})$" "/?_LOCALE_=$1" break;
    rewrite "^/([a-z]{2})/(.*)$" "/$2?_LOCALE_=$1" break;
}