nginx 在重定向时端口出错的问题
当访问的uri最后不带斜杠时,例如 http://localhost/product ,会先查找 product 文件,存在就返回;若存在 product 文件夹,会在末尾加上一个斜杠并产生 301 跳转。
当访问的uri最后带斜杠时,例如 http://localhost/product/,查找 product 下的 index 页面,存在就返回;不存在且未开启自动索引目录选项(autoindex on)则报 403 错误。
在第一种情况,访问带目录的url时,如果末尾不加斜杠("/"),nginx默认会加上斜杠,发生一次301跳转,但这个默认行为在nginx前端有LB负载均衡器、且LB监听的端口与nginx server监听的端口不同时会导致访问出错。
可以使用docker模拟错误
浏览器访问http://127.0.0.1:8181/test 后发现,nginx在末尾添加斜杠重定向时,端口会被重定向到81端口,会访问到 http://127.0.0.1:81/test/ ,由于本地宿主机只监听了8181端口所以会无法访问。
使用curl 看一下过程
解决方案
对外对内使用相同的端口号,如都修改成8181或者81,但治标不治本。
nginx配置添加
absolute_redirect off;
,可以取消绝对路径的重定向。
删除容器重新启动再次测试,可以发现Location已经变成相对路径了
如果没有生效,请检查nginx是否版本过低
版权声明: 本文为 InfoQ 作者【烫烫烫个喵啊】的原创文章。
原文链接:【http://xie.infoq.cn/article/7db4e36c1123786578486aa57】。文章转载请联系作者。
评论