nginx常见bug汇总

1. 前端路由和后端路由冲突

初识问题

假设在nginx项目目录下有个/vue的文件夹,同时我也配置了一个/vue的vue项目路由服务。
那么此时此刻,我浏览器输入localhost:8080/vue浏览器会显示vue文件夹下的静态网页呢,还是显示配置好的vue项目呢?

nginx配置如下

location / {
    # 在html目录下有vue文件夹,vue文件夹下有index.html
    root   D:\nginx\nginx-1.20.0\html;
    index  index.html index.htm;
    autoindex on;       #开启nginx目录浏览功能
    autoindex_exact_size off;   #文件大小从KB开始显示
    charset utf-8;          #显示中文
}
# 写我们的router路由/vue
location /vue{
    // alias后面写项目所在目录
    alias D:/nginx/nginx-1.20.0/html/dist;
    charset utf-8;          #显示中文
}

答案

显示vue项目,忽略/vue下的静态网页

因为路由的优先级比文件夹更高

提出新问题

好了,假设我把上面的vue文件夹改下名字,就叫vuexx的文件夹。请问浏览器访问localhost:8080/vuexx,能访问到下面的index.html嘛

问题答案

不能!浏览器会显示404没找到资源,现在我们先保留这个疑问,进行进一步测试。我们对vuexx文件夹重命名mvue,访问localhost:8080/mvue发现竟然可以访问index.html静态网页了。具体为什么会这样呢?请看下面的算法解读

nginx路由匹配算法

对于nginx这个迷惑行为:本人猜测底层设计逻辑如下,首先根据用户访问的路由优先和服务器(非静态资源)所在路由进行开头正则匹配,如果开头能匹配上,那么就锁定在服务端进行路由查找,进而忽略静态资源路由(也就是文件夹)。如果用户访问路由和服务器所在的所有路由开头都匹配不上,那么nginx会直接认定在静态资源中查找路由,从而忽略在服务端查找相关的路由服务

一般地,静态资源路由被称之为前端路由,服务端资源路由被称之为后端路由

这样就能很好的解释为什么/vue可以访问vue项目,/vuess不能访问静态的资源网页

因为道理很简单,用户访问的/vuess和服务器的路由/vue开头匹配上了,nginx会直接认定在服务器路由查找,忽略在静态资源中查找了,当然服务端可没有这个路由所以即使静态资源有/vuess这个文件夹,也是徒劳的

2.nginx只识别/

初识问题

我们有些时候直接从文件资源管理器复制的文件夹路径(如:D://xx/yy)在nginx配置上不生效,怎么访问都是404(没有找到资源)

原理解读

在nginx中,它不支持\,只支持/

# 写我们的路由暗号/vue
location /vue{
    # alias后面写项目所在目录 xxxxxxx一定要注意,不能写成D:\nginx\nginx-1.20.0\html\dist,要写成斜杠/形式,否则会404
    alias D:/nginx/nginx-1.20.0/html/dist;
    charset utf-8;          #显示中文
}

写成\会出错

3.代理不生效

初识问题

明明设置了代理,代理缺不生效

问题解决

  • 路由写成/xxx/不要写成/xxx(不这么写有时候会出问题,取决于后端)
  • 代理地址后面没有加/(写成http://xxx.cn是不行的,要写成http://xxx.cn/)
  • 访问地址url中没有加/api【取决于你配置的代理路由】

配置实例

location /api/{
    proxy_pass  http://121.36.94.221:6600/;
    index  index.html index.htm;
}
		
location /info/{
    proxy_pass  http://ckk.xiaoandcai.cn/;
    index  index.html index.htm;
}

还有一种情况代理不成功是,后端把接口关闭了(…)

4.错误日志中报乱码

初识问题

我们在错误日志中可以看到乱码了,怎么启动nginx都是报乱码的错误

问题解决

你可能用记事本打开配置文件并修改配置了,记住你是不能用记事本去编辑这个配置文件的。如果你想编辑它,请百度下载notpadd++。

如果你现在已经出现了乱码错误,请另存为utf-8编码就可以了(需要下载notepadd++,点击菜单编码进行转换)

原理分析

记事本会默认把文件修改成带BOM的UTF-8编码,可我们源文件的编码格式是普通UTF-8编码,所以肯定不行

5.总是显示跨域错误

初识问题

我们总是会发现跨域问题,我们明明设置跨域了,还是不行

问题解决

每个路由都需要添加跨域(必须每个都设置)

location / {
    root   html;
    index  index.html index.htm;
    autoindex on;       #开启nginx目录浏览功能
    autoindex_exact_size off;   #文件大小从KB开始显示
    charset utf-8;          #显示中文
    add_header 'Access-Control-Allow-Origin' '*'; #允许来自所有的访问地址
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS'; #支持请求方式
    add_header 'Access-Control-Allow-Headers' 'Content-Type,*';
}

location /vue{
    alias D:/nginx/nginx-1.20.0/html/dist;
    charset utf-8;          #显示中文
    add_header 'Access-Control-Allow-Origin' '*'; #允许来自所有的访问地址
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS'; #支持请求方式
    add_header 'Access-Control-Allow-Headers' 'Content-Type,*';
}

location /api/{
    proxy_pass  http://121.36.94.221:6600/;
    index  index.html index.htm;
    add_header 'Access-Control-Allow-Origin' '*'; #允许来自所有的访问地址
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS'; #支持请求方式
    add_header 'Access-Control-Allow-Headers' 'Content-Type,*';
}

location /info/{
    proxy_pass  http://ckk.xiaoandcai.cn/;
    index  index.html index.htm;
    add_header 'Access-Control-Allow-Origin' '*'; #允许来自所有的访问地址
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS'; #支持请求方式
    add_header 'Access-Control-Allow-Headers' 'Content-Type,*';
}

原理分析

nginx路由是并联的,需要分别设置,目前博主还没有找到全局中间件的写法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值