我的 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 库构建”。也许在解析未知转义序列时,这会比以前更严格。
答案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 之间的区别,新版本可能对正则表达式有更严格的验证,这就是为什么它现在会针对先前接受的配置抛出错误。