我有一个 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
和最终目录之间可能存在多少个祖先目录。
任何建议将不胜感激。
尝试:
^/product-category/(?:.*/)?([^/]+)/$
$request_uri
变量包含原始 URL 的路径和查询部分。
在您的示例中,它始终以
/product-category/
开头并以 /
结尾,并且其间可以包含任意数量的路径段。
解决方案分解如下:
^/product-category/
(?:.*/)?
([^/]+)
/$
步骤 (1) 与beginning处的路径段匹配(因此是字符串锚点
^
的开始)。
步骤 (2) 是一个非捕获组,它匹配以
/
结尾的任何文本,包括包含多个 /
的文本,因此将消耗一个或多个路径段。我们添加尾随 ?
使其成为可选,因此它也匹配零路径段。
步骤 (3) 捕获
$1
,这是两个 /
之间的文本。
步骤 (4) 用最后的
/
和字符串锚点结束来完成表达式。
此解决方案假设没有查询字符串或分隔符
?
。