nginx用排除重写

时间:2011-07-07 21:05:54

标签: regex redirect nginx

我有一个网站最近更改了其网页结构,以添加多种语言的功能(英语为/en/,法语为/fr/。我在my server {}块中有以下重写规则:

    try_files $uri $uri/ @abc;
    location @abc {
            if ($uri !~ "^/(.*)\/(.*)$") {
                    rewrite ^/(.*)$ /en/$1 permanent;
            }
            rewrite ^/(.*)\/(.*)$ /index.php?lang=$1&page=$2;
    }
    rewrite ^/$ /en/$1 permanent;

这有点乱,但我似乎无法实现我的需要:

  • 应检查所有访问过的链接以查看该文件是否存在(有效)
  • 所有“旧”链接(例如/abc)应为301 /en/abc(有效,但似乎是hackish)
  • 应将网站的根目录重定向到/en/(有效)
  • /en/abc格式的链接应以index.php的形式发送至?lang=$1&page=$2(其中包括/en/abc/123 abc/123$2和{{} 1}}是en)。 $1可以有任意长度,例如$2

我的“似乎”工作得很好,但子网页abc/123/456似乎将abc/123设置为$1en/abc设置为$2 t期望并导致404错误,因为脚本找不到页面123。提前感谢您的任何答案!

1 个答案:

答案 0 :(得分:2)

试试这个

try_files $uri $uri/ @abc;
location @abc {
        if ($uri !~ "^/([^\/]*)\/([^\/]*)$") {
                rewrite ^/(.*)$ /en/$1 permanent;
        }
        rewrite ^/([^\/]*)\/([^\/]*)$ /index.php?lang=$1&page=$2;
}
rewrite ^/$ /en/$1 permanent;

我已将.*替换为[^\/]*