NGINX支持PCRE2扩展替换处理吗?

问题描述 投票:0回答:2

我需要做一些非常复杂的重写,我不想重复太多。 PCRE2 条件替换允许我这样做,但我似乎无法让它们在 nginx 中工作。是不支持还是我做错了什么?

这些是我想要统一的重写。

    rewrite /intro/(es|en)-(es|uk)/pageA /$1-$2/pageB/;
    rewrite /intro/(es|en)_(es|uk)/pageA /$1-$2/pageB/;
    rewrite /intro/(es|en|uk)/pageA /$1/pageB/;
regex nginx pcre
2个回答
1
投票

不,事实并非如此。 nginx 目前仅支持原始 PCRE 库。


0
投票

不,尽管 NGINX 1.21.5 将 PCRE2 作为默认的正则表达式引擎,但它实际上并没有使用 PCRE2 进行替换。

相反,NGINX 只是简单地获取正则表达式捕获的值并将其转换为 NGINX 变量。然后,

rewrite
和其他指令让您使用变量将它们组合成新字符串。

所以,不幸的是,你不能使用任何 PCRE2 替代功能。

也许您可以使用

map
指令,基于正则表达式设置新变量:

http {
    # map can only be used at the http context
    map $uri $intro_lang {
        ~^/intro/(es|en)[-_](es|uk)/    "$1-$2"
        ~^/intro/(es|en|uk)/            "$1"
        default                         "uk"
    }
    server {
        # rewrite goes in the server context, or inside a location directive.
        rewrite /intro/[^/]*/pageA /intro/$intro_lang/pageB/;
    }
}

注意

map
出现在
http
上下文中;如果您使用的发行版使用来自
/etc/nginx/conf.d
的包含文件,那么这些文件通常已经包含在
http {}
上下文中,因此这些包含文件的顶层是
map
指令的正确上下文。

© www.soinside.com 2019 - 2024. All rights reserved.