一、背景
我们在访问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 即可
修改配置:
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持IT俱乐部。