【问题标题】:Nginx rewrite with conditional destinationNginx 用条件目的地重写
【发布时间】:2012-01-03 05:09:41
【问题描述】:

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

foo.com/model/idfoo.com/model/id/action

这些 URL 提供的实际页面采用以下形式

$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 中完成吗?

【问题讨论】:

    标签: nginx rewrite


    【解决方案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
    }
    

    “(/?)”只是为了防止网址有时带有斜杠。如果他们从不这样做,则可以将其删除。在这种情况下,最好总是专门添加一个右斜杠并将“(/?)”作为“/”。

    【讨论】:

    • 根据您的回答,我可以假设您是说单次重写无法做到这一点吗?正如您所概述的那样,我目前正在使用两次重写,但希望只使用一次。
    • 我为什么要这样做?为了踢球,好奇。如果我可以在一行中完成(并且它是可读的),为什么要在两行中完成?不幸的是,这看起来是不可能的。不过谢谢!
    • 哈!为了踢!你可能可以用 lua 来做,但它会很长:) 总而言之,不值得这么麻烦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 2018-01-13
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多