【问题标题】:How to extract digits from a URL and save them in a variable?如何从 URL 中提取数字并将它们保存在变量中?
【发布时间】:2017-09-12 23:31:42
【问题描述】:

我有一个转发请求,其中涉及一堆带有生产 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;
}

【问题讨论】:

    标签: regex perl nginx pcre


    【解决方案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;
    }
    

    【讨论】:

    • 非常感谢您的回复。我可以通过使用“return 200”Production id: $prod_id”获得显示的变量值。但是,当我尝试设置位置指令时,我无法进行转发工作。我的转发如下:
    • 您可能需要更具体地指定位置。我的例子可能太笼统了。我在示例前缀位置添加了另一个目录,但您可能需要进行更多试验。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你会想要这样的东西

      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;
      }
      

      【讨论】:

      • 感谢您的回复。我可以使用一些参数或通配符来替换“卡片”、“笔记卡”和这些数字之前的字符串吗?原因是我们有不同的产品类别组成产品链接。一个例子是 /abc/en_us/Products/binder/single-binder/XXX-12345.htm。
      【解决方案4】:
      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;
          }
      

      【讨论】:

        猜你喜欢
        • 2018-01-01
        • 2013-12-14
        • 1970-01-01
        • 2015-05-07
        • 2017-10-31
        • 2014-07-25
        • 1970-01-01
        • 1970-01-01
        • 2013-03-01
        相关资源
        最近更新 更多