Nginx配置正则报错pcre_compile() failed缺失右括号问题咨询
报错根本原因
这个问题是Nginx配置解析的优先级规则和语法书写错误共同导致的,具体逻辑如下:
- 首先Nginx的
if指令有严格的语法要求:条件表达式必须完整包裹在一对括号内,正确格式为if ( <条件> ) {,你第一个错误写法漏写了条件末尾的闭合右括号。 - Nginx解析配置时会优先做语法标记拆分,再处理正则内容:解析
if块时会先匹配括号来确定条件的边界,这个过程不会区分括号是否位于正则的引号内部。
你第一个写法的代码:
if ($request_uri !~ "(abc|def)" {
解析器找不到你显式写的if条件闭合括号,就把正则内部的)当成了if的闭合括号,最终传递给PCRE正则引擎的表达式被截断为"(abc|def,自然会报missing )的编译错误。
你第二个写法虽然不报错,但属于逻辑错误的巧合:
if ($request_uri !~ "(abc|def))" {
你在正则内部多写了一个),解析器把这个多出来的)当成了if的闭合括号,刚好让传递给PCRE的正则内容是完整的(abc|def),所以不会触发正则编译错误。但此时你写的双引号会被当做正则的一部分,实际匹配规则变成了匹配带双引号的abc或def,和你的预期逻辑完全不符。
正确写法
写法1:省略正则引号(无特殊字符时推荐)
if ($request_uri !~ (abc|def)) { return 404; }
写法2:把if闭合括号写在引号外
if ($request_uri !~ "(abc|def)") { return 404; }
内容的提问来源于stack exchange,提问作者klodoma
相关产品推荐
相关产品推荐

