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