0

我想在 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;

但是您将如何处理上述情况,您不一定知道具体路径?

4

1 回答 1

0

你给出了三个路径,它们都有共同的模式/product/,你说没有必要知道具体的路径,所以我可以假设你考虑了你的路径的其余部分。那么这个可以改变的将是view/32/add/32/edit/32。在这种情况下,您可以尝试这样rewrite的指令:

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 从/32to ?id=32。在这种情况下,我们可以通过与第一个解决方案相同的方式实现它,但只需稍作改动:

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

这里作为变量$1将被设置product/view, product/add, post/edit,foo/bar和所有其他匹配模式的情况([a-zA-Z]+/[a-zA-Z]+)。对于变量$2,将仅设置id停留在原始 url 末尾的值。

于 2013-02-02T10:59:06.227 回答