NGINX 重写捕获 URL 最后部分和匹配第一部分的问题

问题描述 投票:0回答:1

我有一个 NGINX 重写/返回块,如下所示:

if ($request_uri ~ /product-category/(.*)/$) {
   return 301 /shop/?categories[]=$1;
}

这正确匹配

https://example.com/product-category/cat-1/
并将其重定向到
https://example.com/shop/?categories[]=cat-1

但是,我有一些 URL 在

product-category
和最终
cat-1
之间具有可变数量的目录,即

https://example.com/product-category/parent/cat-1/
https://example.com/product-category/gparent/parent/cat-1/
https://example.com/product-category/distant-relative/gparent/parent/cat-1/
...

我正在寻找一个

rewrite
return
规则,该规则将匹配域后以
product-category
开头的任何 URL,提取最后一个目录名称,并像第一个示例中那样编译我的重定向。

换句话说,我需要某种方式将上面第二个示例中的所有 URL 重定向到

https://example.com/shop/?categories[]=cat-1
,无论
product-category
和最终目录之间可能存在多少个祖先目录。

任何建议将不胜感激。

nginx
1个回答
0
投票

尝试:

^/product-category/(?:.*/)?([^/]+)/$


$request_uri
变量包含原始 URL 的路径和查询部分

在您的示例中,它始终以

/product-category/
开头并以
/
结尾,并且其间可以包含任意数量的路径段。

解决方案分解如下:

  1. ^/product-category/
  2. (?:.*/)?
  3. ([^/]+)
  4. /$

步骤 (1) 与beginning处的路径段匹配(因此是字符串锚点

^
的开始)。

步骤 (2) 是一个非捕获组,它匹配以

/
结尾的任何文本,包括包含多个
/
的文本,因此将消耗一个或多个路径段。我们添加尾随
?
使其成为可选,因此它也匹配零路径段。

步骤 (3) 捕获

$1
,这是两个
/
之间的文本。

步骤 (4) 用最后的

/
和字符串锚点结束来完成表达式。

此解决方案假设没有查询字符串或分隔符

?

© www.soinside.com 2019 - 2024. All rights reserved.