nginx 报错 `nginx:[emerg] unknown directive`

首先看错误信息

1
nginx:[emerg] unknown directive "sub_filter '<html>' '<htm] style="pointer-events: none">' in xxxxx

以上为nginx -t测试配置文件报错,而 sub_filter 配置在本地是已经测试通过了!!

排查

当然首先是排查是不是sub_filter指令不支持,运行nginx -V能看到--with-http_sub_module正常启用了。

那么为何报错?

原因

来看两个配置语句:

  1. 配置一
1
sub_filter '<html>' '<html style="pointer-events: none;">';
  1. 配置二
1
sub_filter '<html>' '<html style="pointer-events: none;">';

文章经过编译之后可能导致有问题的字符不在显示

仅凭肉眼绝对看不出以上两个配置有任何区别,来看看 vscode 编辑器给的显示效果。

在写这篇文章时候的效果:

明显看到两配置的颜色显示不一样!

再看看复制到HTML文件中的效果:

vscode 给了一个警告,提示此处有不可见字符!!

将此处的警告字符用 charCodeAt 看看字符的 Unicode 编码可得到为 160,正常的空格字符 Unicode 是 32

1
2
' '.charCodeAt() // 160
' '.charCodeAt() // 32

文章经过编译之后可能导致有问题的 160 字符转为 32

针对 160 和 32 的字符说明:

Ascii说明
32space
160non-breaking space (不换行空格)是防止在其位置自动换行的空格字符,一般由网页复制而来

为何会如此

原因已经找到:Unicode 为 160 的空格字符串导致了文章最开是的 nginx 错误提示

那么这个160字符串从哪儿产生的??

由于开发需要,本机运行了一个华为快应用开发工具 Huawei QuickApp IDE,版本 12.7.1-China-20230105

本地修改nginx配置就在此编辑器处理,处理完之后 nginx 启动测试都无问题!

然后就复制配置指令通过微信发给运维操作了,问题就在此!!

在这开发工具里面修改配置没问题,但是你要是敢复制到微信,嘿嘿,那不好意思,微信兄弟就会把你 32 的空格转为 160 !!

但是复制到飞书、浏览器里面又不会变成160,也不知道为啥复制到微信会变为160!!

又试了下从vscode里面复制到微信也不会变为160!!!

编程神奇吧~~

本文由 linx(544819896@qq.com) 创作,采用 CC BY 4.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。本文链接为: https://blog.jijian.link/2023-07-16/nginx-unknown-directive/

如果您觉得文章不错,可以点击文章中的广告支持一下!