Nginx使用条件目标重写

时间:2012-01-02 19:48:01

标签: nginx rewrite

我有一个包含两个RESTful URL方案的网站:

foo.com/model/idfoo.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中完成吗?

1 个答案:

答案 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
}

“/(?)”以防万一网址有时带有结尾斜杠。如果他们从未这样做,就可以将其删除。在这种情况下,最好特别总是添加一个结束斜杠并将“(/?)”作为“/".