我有一个包含两个RESTful URL方案的网站:
foo.com/model/id
和
foo.com/model/id/action
这些网址所服务的实际网页采用
的形式 $model.php?id=$id
和
分别为$model_$action.php?id=$id
。
我有一个正则表达式,它将匹配两个案例^(\w+)s/([A-z0-9]+)(?:/(\w+))?/?$
,我想使用单个Nginx规则来重写两种类型的URL,但我不知道如何做到这一点。在伪代码中我想象规则看起来像这样
rewrite ^(\w+)s/([A-z0-9]+)(?:/(\w+))?/?$ /(($3) ? $1_$3.php?$id=$2 : $1.php?$id=2)
这不是有效的语法(据我所知),但这样的事情可以在Nginx中完成吗?
答案 0 :(得分:1)
从重叠匹配字符串的最长到最短开始依次重写可能的URL,在这种情况下,“/ model / id”将首先在较长的url字符串中匹配。
location / {
# For "/model/id/action" to "$model_$action.php?id=$id"
rewrite ^/(.+)/(.+)/(.+)(/?)$ $1_$3.php?id=$2 last;
# For "/model/id" to "$model.php?id=$id"
rewrite ^/(.+)/(.+)(/?)$ $1.php?id=$2 last;
}
location ~ .+\.php$ {
# Handle PHP
}
“/(?)”以防万一网址有时带有结尾斜杠。如果他们从未这样做,就可以将其删除。在这种情况下,最好特别总是添加一个结束斜杠并将“(/?)”作为“/".