nginx反向代理如何支持网址自动添加斜线
一、背景
我们在访问nginx代理下的项目前端页面时
当请求URL后面没有 /
nginx目录中如果没有对应的文件
就会自动进行 301 并加上 /
二、问题
通过lua+nginx进行proxy_pass+upstream负载后,带二级目录的页面访问路径出错,无法解析。
例如访问 https://xxx.com.cn/admin (未带/ ) 时会跳转至 http://safes-normal:8092/admin/ ,301后的地址出错。
原有配置如下:
三、解决方案
第一步:解决重定向域名问题
在location处添加
proxy_set_header Host h o s t : host: host:proxy_port; proxy_set_header X-Forwarded-For $remote_addr;
例如
原因:
当URL 指向一个目录并且在最后没有包含“/”时,Nginx 内部会自动的做一个 301 重定向,由于我们的nginx中的server_name_in_redirect 值为 off ,故URL 重定向为: 原 URL 中的域名 + 目录名 + /。
而我们没设置proxy_set_header Host 时,浏览器直接访问 nginx,获取到的 Host 是 proxy_pass 后面的值,即 safes-normal。
故浏览器跳转成了 http://safes-normal:8092/admin/。
当我们设置了proxy_set_header Host h o s t : host: host:proxy_port后,再访问 https://xxx.com.cn/admin ,此时会发现浏览器会301至https://xxx.com.cn:8092/admin/,这样也会导致访问失败,因为我们希望得到的结果是:
https://xxx.com.cn/admin 重定向为 https://xxx.com.cn/admin/
第二步:解决重定向后的端口问题
查阅资料发现nginx中有 port_in_redirect 配置
如果port_in_redirect为off 时,那么始终按照默认的端口;如果该指令打开,那么将会返回当前正在监听的端口。
由于port_in_redirect默认为on,所以导致我们重定向的时候,带了server中的端口8092,如果希望nginx在301重定向时不带端口,设置port_in_redirect为off 即可
修改配置:
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
详解Nginx的超时keeplive_timeout配置步骤
Nginx 处理的每个请求均有相应的超时设置,本文主要介绍了Nginx的超时keeplive_timeout配置步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2022-05-05配置Nginx出现403(Forbidden)静态文件加载不出来的解决方法
本文主要介绍了配置Nginx出现403(Forbidden)静态文件加载不出来的解决方法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-12-12
最新评论