【问题标题】:Nginx location group capture + rewriteNginx位置组捕获+重写
【发布时间】:2016-04-17 04:51:48
【问题描述】:

我正在尝试在 Nginx 位置块中进行组捕获,但它不适合我。

我正在尝试做的事情是否可能?

location ~* /(?<cat>cars|trucks|bikes|motorcycle|quads) {
    rewrite ^/$cat/([0-9]+)(.*)$ /page.php?id=$1 last;
}

我收到的错误信息是:

“^/$cat/([0-9]+)(.*)$”不匹配“/cars/120/new-car-rentals/”

我的类别比我发布的要多得多,并试图防止为每个特定类别名称重写 5x。

任何帮助将不胜感激。

【问题讨论】:

    标签: nginx pcre


    【解决方案1】:

    我通过这样做解决了这个问题:

    location ~* /(cars|trucks|bikes|motorcycle|quad-bikes) {
        rewrite ^/([a-zA-Z-]+)/([0-9]+)(.*)$ /page.php?id=$2 last;
        ...
        ...
    }
    

    正则表达式 ([a-zA-Z-]+) 允许我在类别/页面名称中使用字符 a-z(不区分大小写)和可能的破折号。

    【讨论】:

    • 为了匹配路径部分(斜线之间的一堆非斜线),我们还可以使用负字符类,如/[^/]+/。我自己经常使用它。
    【解决方案2】:

    我不熟悉这种特殊语法,但根据我与其他人的经验,您是否可能只需要转义正在使用的正斜杠?

    location ~* \/(?<cat>cars|trucks|bikes|motorcycle|quads) {
        rewrite ^\/$cat\/([0-9]+)(.*)$ /page.php?id=$1 last;
    }
    

    注意location正则表达式中的命名捕获:如果要使用此处捕获的值,则必须使用命名语法(?&lt;name&gt;),数字不起作用。

    【讨论】:

    • 我从不需要在其他重写时转义正斜杠。这是我从以下获得语法的地方:nginx.org/en/docs/http/server_names.html#regex_names
    • 你不需要在 nginx 配置中转义斜杠,因为它不使用斜杠作为正则表达式分隔符。他们只是那里的另一个角色。
    猜你喜欢
    • 2014-12-06
    • 2016-02-14
    • 2012-04-16
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2013-12-16
    • 1970-01-01
    相关资源
    最近更新 更多