Url rewriting Nginx重写:用查询字符串替换尾随数字

Url rewriting Nginx重写:用查询字符串替换尾随数字,url-rewriting,nginx,Url Rewriting,Nginx,我希望在Nginx中实现以下目标: /product/view/32 ---> /product/view?id=32 /product/add/32 ----> /product/add?id=32 /product/edit/32 ---> /product/edit?id=32 /post/view/32 ---> /post/view?id=32 /post/add/32 ----> /post/add?id=32 /post/edit/32 --->

我希望在Nginx中实现以下目标:

/product/view/32 ---> /product/view?id=32
/product/add/32 ----> /product/add?id=32
/product/edit/32 ---> /product/edit?id=32
/post/view/32 ---> /post/view?id=32
/post/add/32 ----> /post/add?id=32
/post/edit/32 ---> /post/edit?id=32
/foo/bar/32 ---> /foo/bar?id=32
如果您心中有一个特定的文件,那么您可以编写如下内容:

rewrite ^/path/(.*)$ /path/file.php?id=$1 last;

但是,如果你不一定知道具体的路径,你会如何处理上面的情况呢?

你给出了三条路径,它们都有共同的模式
/product/
,你是说不一定要知道具体的路径,所以我可以假设你考虑了路径的其余部分。然后,可以更改的将是
查看/32
/add/32
/edit/32
。在这种情况下,您可以尝试这样的
重写
指令:

rewrite ^/product/([a-zA-Z]+)/[0-9]+) /product/$1?id=$2 last;
这里作为变量
$1
您将获得
/product/
路径和您的id值之间的任何内容。变量
$2
只会将
id
表示为原始路径末尾的一个数字


根据您问题中的变化似乎总是有一条不变的路径,在重写后永远不会改变,例如:

当主路径以
/product/add
开头时,您总是将其重写为
/product/add
,如果它是
/post/add
,它也将被重写为
/post/add
。唯一会改变的是您的id从
/32
变为
?id=32
。在这种情况下,我们可以通过与第一个解决方案相同的方式实现它,但只需稍作更改:

rewrite ^/([a-zA-Z]+/[a-zA-Z]+)/([0-9]+)$ /$1?id=$2; last;

这里作为变量
$1
将被设置为
产品/视图
产品/添加
发布/编辑
foo/bar
,以及所有其他匹配模式的案例
([a-zA-Z]+/[a-zA-Z]+)
。对于变量
$2
将只设置
id
的值,该值位于原始url的末尾。

您的意思是不知道路径的哪一部分?您给出了三个重定向示例,它们都具有与
/product/
相同的路径,是吗?我们会有点困惑吗?我不清楚。我更新了我的帖子。
/product/
不是我的URL方案中给定的(我更新了我的问题以反映这一点),但我将始终使用这种类型的结构:
/