如何从URL中提取数字并将其保存在变量中?

时间:2017-09-12 23:31:43

标签: regex perl nginx pcre

我有转发请求,涉及一堆带有生产ID的产品。

http://www.example.com/abc/en_us/Products/Cards/Note-Cards/Laser-Note-Cards_05315.htm

 www.example.com/products/cards/05315

所以我想制作一个正则表达式模式以匹配原始URL中的四位或五位数产品ID,并使用变量来保存它。然后我们可以重用该变量来构建目标链接。

我已经像以前一样制定了规则,但它不起作用。这里有人可以帮我这个或者给我一些我可以模仿的例子吗?

location ~ ^/abc/en_us/(?<myvar>[0-9][0-9][0-9][0-9]|[0-9][0-9][0-9][0-9][0-9]) {
 # use variable $myvar here
 #if ( $myvar = "sth" ) { ... }
 rewrite ^/$1/$2/$myvar;
}

4 个答案:

答案 0 :(得分:1)

地图是捕获变量值的好方法。这是一个使用正则表达式的安全场所;这意味着它会破坏配置的自然流动与正则表达式位置(请参阅:Scaleable NGINX Configuration: Igor Sysoev @nginxconf 2014)。该变量在请求周期的早期设置,可以在整个配置中使用。

map $uri $prod_id {
    ~(?<p_id>\d+)\.htm$ $p_id;
}

server {
    server_name www.example.com;
    return 200 "Production id: $prod_id
";
}

因此以下前缀位置应该有效:

location /avery/en_us/Products/ {
    return 301 http://www.avery.com/$prod_id;
}

答案 1 :(得分:0)

使用此:$myvar = $1 if $location =~ m/^abc.*(\d+).htm/;

$ 1将是在.htm之前匹配的第一组数字。

答案 2 :(得分:0)

你会想要这样的东西

server {
    listen 80; 
    server_name www.example.com;
    rewrite ^/abc/en_us/Products/Cards/Note-Cards/Laser-Note-Cards_([0-9]+).htm /products/cards/$1 last;
}

答案 3 :(得分:0)

Finally, I got it working by using "mapping" and regex with if. Thanks for all the help. 

First, define the variale from the URL. 
map $uri $prod_id {
      ~(?<p_id>\d+)\.htm$ $p_id;
 }

Second, make rewrite rule based on if statement. 
if ($uri ~ "^/avery/en_us/Products/([0-9a-zA-Z-_]*)/([0-9a-zA-Z-_]*)/([0-9a-
 zA-Z-_.]*).htm$") {
             rewrite ^/avery/en_us/Products/([0-9a-zA-Z-_]*)/([0-9a-zA-Z-
 _]*)/([0-9a-zA-Z-_.]*).htm$ http://www.avery.com/$prod_id permanent;
    }