Regex 如何从URL中提取数字并将其保存在变量中?
我有一个转发请求,其中涉及一系列具有生产ID的产品Regex 如何从URL中提取数字并将其保存在变量中?,regex,perl,nginx,pcre,Regex,Perl,Nginx,Pcre,我有一个转发请求,其中涉及一系列具有生产ID的产品 http://www.example.com/abc/en_us/Products/Cards/Note-Cards/Laser-Note-Cards_05315.htm 到 因此,我想创建一个正则表达式模式来匹配原始URL中的四位或五位产品ID,并使用一个变量来保存它。然后我们可以重用该变量来构建目标链接 我像以前一样制定了一个规则,但它不起作用。这里有人能帮我吗?或者给我举一些我可以模仿的例子 location ~ ^/abc/en_us
http://www.example.com/abc/en_us/Products/Cards/Note-Cards/Laser-Note-Cards_05315.htm
到
因此,我想创建一个正则表达式模式来匹配原始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;
}
如果$location=~m/^abc.*\d+.htm/,则使用:$myvar=$1
$1将是在.htm之前匹配的第一组数字 你会想要这样的东西
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;
}
映射是捕获变量值的好方法。使用正则表达式是一个安全的地方;这意味着它确实会破坏您的配置与正则表达式位置的自然流动,请参见:。该变量在请求周期的早期设置,可以在整个配置过程中使用
map $uri $prod_id {
~(?<p_id>\d+)\.htm$ $p_id;
}
server {
server_name www.example.com;
return 200 "Production id: $prod_id
";
}
谢谢你的回复。我可以使用一些参数或通配符来替换卡片、注释卡片和这些数字之前的字符串吗?原因是我们有不同的产品类别组成产品链接。例如/abc/en_us/Products/binder/single binder/XXX-12345.htm。非常感谢您的回复。我能够通过使用return 200 Production id:$prod_id获得显示的变量值。但是,当我尝试设置location指令时,我无法获得转发工作。我的转发如下:您可能需要使位置更加具体。我的例子可能太笼统了。我已经在示例前缀位置添加了另一个目录,但您可能需要进行更多的实验。
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;
}
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;
}