大牛?无他,唯手熟尔!

nginx多层代理不加斜杠访问的问题

摘要:在一个项目中发现,项目经过nginx多层代理后,如果不加斜杠访问会自动加上端口号导致无法访问。这种场景网上资料很少,经过笔者自己一番折腾和探索,整理出两种可行方案。

本文由草根java提供,转载请注明出处https://www.caogenjava.com/detail/119.html

场景

  1. 外网服务器跟内网服务器都装有nginx,现需要通过外网服务器的nginx为内网的一个项目配置一个外网访问地址

  2. 已有外网地址,例如:www.caogenjava.com

  3. 已有内网地址,例如:192.168.1.10:8080/blog

  4. 期望可以通过www.caogenjava.com/blog访问到内网项目

外网nginx配置

location /blog {
	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header REMOTE-HOST $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://192.168.1.10:8080/blog;
}

实际情况

  1. 带斜杠访问www.caogenjava.com/blog/正常

  2. 不带斜杠访问www.caogenjava.com/blog会跳转至www.caogenjava.com:8080/blog/导致无法访问

度娘折腾

相关资料很少,只找到一篇类似帖子,方案是设置port_in_redirect为off,但是经过测试,方案无效。于是自己折腾,发现两种方案。

方案一:调整外网nginx配置

location /blog/ {
	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header REMOTE-HOST $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://192.168.1.10:8080/blog/;
}

就是location后面跟proxy_pass后面的项目都跟着斜杠,这个方案可行有个前提条件:就是外网的访问协议跟内网的访问协议必须一致,即都是http或者都是https。很遗憾,我们的项目外网是https,内网是http,此方案对我们来说不可行。看方案二。

方案二:调整内网nginx配置

location /blog {           
    rewrite ^/(.*) http://www.caogenjava.com/blog/;
}
location /blog/ {
    proxy_pass http://127.0.0.1:8001/blog/;
}

看到这个配置,大家应该明白是什么意思了吧,思路就是:如果你不带斜杠访问,我就强行重定向到带斜杠访问的外网地址上。经过测试,完美解决。

注意事项

  1. 调整了nginx配置,请马上清理浏览器缓存,否则看不到效果。

  2. 本文使用的nginx版本为当前最新稳定版1.20.1,其他版本未做测试。

  3. 你所使用的容器也会有影响,例如方案二,在tomcat容器下正常,在Jetty容器下经过简单测试发现不适用。



双11云服务器热购推广(腾讯云):2核+4G内存+3M带宽=688元/3年(仅限新用户)

除非注明,文章均为草根java原创,转载请注明本文地址: https://www.caogenjava.com/detail/119.html

下一篇:centos8安装中文环境的正确姿势
网友评论,共0 发表评论
昵称:
评论:
验证码: 刷新验证码
双11云服务器热购
    购买建议:带宽不用太高了,1M就够用,多考虑内存。