更新至 nginx 1.21.5 后,“\index.htm(l?)”中的 \ 后面出现无法识别的字符

更新至 nginx 1.21.5 后,“\index.htm(l?)”中的 \ 后面出现无法识别的字符

我的 docker 镜像在构建后突然失败并显示错误消息:

2021/12/30 16:02:26 [emerg] 16#16:pcre2_compile() 失败:/etc/nginx/conf.d/default.conf:37 中“\index.htm(l?)”处的“index.htm(l?)”后面的 \ 后面有无法识别的字符

我们正在从 nginx:latest 构建 docker 镜像,当前版本为 1.21.5。

我已经降级到 nginx 1.21.4,并且启动没有问题。

我的有问题的配置是:

    location ~* \index.htm(l?) {
        add_header Cache-Control 'no-cache, no-store, must-revalidate';
    }

nginx 1.12.4 和 1.12.5 之间是否引入了重大更改,或者我使用了弃用的语法?我从未收到任何警告。

答案1

感谢 AlexD 的评论,我发现了实际的问题:

nginx 1.21.5 中的变化是从 PCRE 切换到 PCRE2。PCRE2 与以前的版本兼容,但它不能容忍以前版本忽略的许多错误。

我的情况中的问题是第一个字母的“转义”,这不是正确的转义(从另一个情况复制粘贴,其中点被转义了)。

PCRE 已默默忽略“转义”并处理正则表达式,就好像“”不存在一样。

PCRE2 抛出错误。

答案2

在发布说明中,他们表示现在“默认使用 PCRE2 库构建”。也许在解析未知转义序列时,这会比以前更严格。

https://nginx.org/en/CHANGES

答案3

\从 index.htm(l?) 中删除对我有用。

新的配置将如下所示

 location ~* index.htm(l?) {
        add_header Cache-Control 'no-cache, no-store, must-revalidate';
    }

此更改不应影响您的配置行为,因为它仍将以不区分大小写的方式匹配 index.htm 或 index.html。

至于 Nginx 1.21.4 和 1.21.5 之间的区别,新版本可能对正则表达式有更严格的验证,这就是为什么它现在会针对先前接受的配置抛出错误。

相关内容