带正则表达式的NGINX /位置

时间:2016-01-25 12:29:56

标签: regex nginx

我希望以下格式的每个请求:/files/(whatever..)/(1 or 2 or 3)将使用files_1命令转到/(whatevet)上游。如果网址采用以下格式/files/(whatever..)/(4 or 5 or 6),则会使用files_2命令转到/(whatevet)上游。

这是我的位置文件:

location ~ "^/files/(.*)/[123]/" {
        rewrite ^/files/(.*)/(.*) /$1 break;
        proxy_pass http://files_1 ;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
}

location ~ "^/files/(.*)/[456]/" {
        rewrite ^/files/(.*)/(.*) /$1 break;
        proxy_pass http://files_2 ;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
}

当我检查日志时,它不会使用命令/files/save/2/进行重定向(使用以下命令进入files_1上游:/save

我该怎么做?

1 个答案:

答案 0 :(得分:3)

您可能有另一个location /块将/files/save/2重定向到/files/save/2/,因为前者与您当前的位置块不匹配。

您可以使用rewrite正则表达式中的命名捕获消除location上的捕获,如下所示:

location ~ "^/files(?<command>.+)/[123]/" {
    rewrite ^ $command break;
    ...
}

或者,更正rewrite指令,以便仅提取命令:

rewrite ^/files(.+)/\d/ $1 break;

或:

rewrite ^/files/([^/]+)/ /$1 break;