我想在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;
但是你如何处理上面的情况,你不一定知道具体的路径?
答案 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/view
,product/add
,post/edit
,foo/bar
以及匹配模式([a-zA-Z]+/[a-zA-Z]+)
的所有其他案例。对于变量$2
,只有id
的设定值保留在原始网址的末尾。