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

时间:2013-02-02 04:13:36

标签: 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 ---> /post/edit?id=32
/foo/bar/32 ---> /foo/bar?id=32

如果你有一个特定的文件,那么你可以这样写:

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

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

1 个答案:

答案 0 :(得分: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。唯一会改变的是您从/32?id=32的ID。在这种情况下,我们可以像第一个分辨率一样实现它,但只需稍作修改:

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

此处变量$1将设置为product/viewproduct/addpost/editfoo/bar以及匹配模式([a-zA-Z]+/[a-zA-Z]+)的所有其他案例。对于变量$2,只有id的设定值保留在原始网址的末尾。