【问题标题】:nginx rewrite rule, let both rules work not just one of themnginx重写规则,让两个规则都起作用,而不仅仅是其中一个
【发布时间】:2014-11-18 05:01:30
【问题描述】:

我正在尝试使此重定向适用于这两个规则,但不知道如何, 根据文档,这应该可以工作,而且他们分开做。但我希望同时应用这两个规则。

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

谁能帮我解决这些规则?花了 30 多分钟试图弄清楚这一点。

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

【问题讨论】:

    标签: mod-rewrite nginx


    【解决方案1】:

    颠倒顺序,因为^/(.*)$ 也匹配^/panel/(.*)。但是你当然可以避免使用带有try_files 指令的if。顺便说一下,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;
        }
    
    }
    

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

    【讨论】:

    • 您好,感谢您的发帖,但都失败了。第一个使 /panel 不再工作
    • @user1162685 那是因为您的配置的其他部分有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 2012-12-15
    相关资源
    最近更新 更多