Nginx配置正则中$符号处理不当触发nginx‑t语法报错

·开发·约 1 分钟 · 262 字

适用环境#

  • Nginx 1.14 ~ 1.20
  • 使用 location ~ 正则匹配URI结尾

问题现象#

配置片段:

nginx
location ~ "index\.sh"$ {
    ...
}

执行配置校验:

bash
nginx -t

报错信息:

text
nginx: [emerg] unexpected "$" in /usr/local/nginx/conf/nginx.conf:19

排查过程#

  1. 标准正则语法中 $ 代表字符串结尾,语法本身没有错误。
  2. 将双引号改为单引号:location ~ 'index\.sh'$,校验正常通过。
  3. Nginx配置语法:双引号会开启变量插值解析,单引号不会。

根本原因#

Nginx配置中双引号包裹的字符串会解析 $ 变量,例如 $host、$uri。 当双引号内写 "index\.sh"$,$ 后面紧跟结束引号,Nginx识别为非法变量名,抛出 unexpected "$" 语法错误。

解决方案#

方案一:使用单引号(推荐)#

nginx
location ~ 'index\.sh$' {
    ...
}

单引号不会解析变量,$ 直接当作正则元字符。

方案二:双引号内转义 $ 符号#

nginx
location ~ "index\.sh\$" {
    ...
}

方案三:省略引号(正则无空格时可用)#

nginx
location ~ index\.sh$ {
    ...
}

延伸说明#

在 rewrite 规则替换字符串中,如果要输出字面量 $,同样需要 \$ 转义;如果要使用 Nginx内置变量,则保持原样。

评论