nginx重写规则,让两个规则不只是其中之一

时间:2014-11-17 19:03:23

标签: mod-rewrite nginx

我试图让这个重定向工作两个规则,但不知道如何, 根据文档,这应该工作,他们分开。但我希望这两条规则都适用。

还应该可以访问/ panel / assets /文件夹。

任何人都可以帮助我遵守这些规则吗?花了30多分钟试图解决这个问题。

if (!-e $request_filename){
   rewrite ^/(.*)$ /index.php last;
   rewrite ^/panel/(.*) /panel/index.php last;
   break;
}

1 个答案:

答案 0 :(得分:0)

反转订单时^/(.*)$也匹配^/panel/(.*)。但你当然可以避免使用if try_files指令。顺便说一下,break指令在这里没用,因为last标志执行内部重定向,因此它永远不会到达。

例如,你可以把它变成这种东西:

location / {
    try_files $uri $uri/ @fallback;
}

location @fallback {
    rewrite ^/panel/(.*)$ /panel/index.php last;
    rewrite ^/(.*)$ /index.php last;
}

另一个想法是将maptry_files一起使用并执行以下操作:

map $uri $target {
    default          "/404.html";
    "~^/panel/(.*)$" "/panel/index.php";
    "~^/(.*)$"       "/index.php";
}

server {

    ...

    location / {
        try_files $uri $uri/ $target;
    }

}

从性能的角度来看,情况会更好,但您必须确保目标资源可用,否则它将最终进入内部重定向周期。