nginx重写排除

我有一个网站,最近改变了页面结构,添加了多种语言的function( /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'd到/en/abc (工作,但似乎hackish)
  • 网站的根目录应该被redirect/en/ (works)
  • /en/abc/123 ,其中abc/123$2en$1 )时,应将/en/abc格式的链接发送到index.php作为?lang=$1&page=$2$2可以有任何长度,如abc/123/456

我似乎工作得很好,但子页面abc/123似乎将$1设置$1 en/abc$2123这是不希望的,并导致404错误,因为脚本无法find页面123 。 预先感谢任何答案!

尝试这个

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

我用[^\/]*替换.* [^\/]*