我需要做一些非常复杂的重写,我不想重复太多。 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/;
不,事实并非如此。 nginx 目前仅支持原始 PCRE 库。
不,尽管 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
指令的正确上下文。