您的位置:首页 > 运维架构 > 反向代理

nginx反向代理tomcat,由于客户端输入的端口不一致造成网页basehref错误的问题及解决办法

2016-08-09 10:46 856 查看
由于端口限制的原因,外网开放的端口是8080,而nginx监听的端口是80,通过端口映射,是外网8080映射至nginx所在主机的80端口上(假设nginx所在主机的ip是192.168.0.1,外网域名是domain.com)。这就导致通过外网访问,浏览器输入的地址是domain.com:8080,而在内网访问则是192168.0.1:80,也就是说,客户端发给nginx的请求的头域中HOST的值可能有两种端口80和8080.而nginx在代理客户端向tomcat发请求时,请求头中的HOST的端口默认是80。因此,tomcat接收到请求后,抓取到的端口号是80。因此,如果jsp中设置了basehref,就会造成无论客户端输入的端口号是80还是8080,basehref中写入的端口号一定是80。因此如果客户端输入的地址是192.168.0.1:8080,客户端可以获取到页面,但是网页中所有src都错误,如图片,外链css、js,iframe等等,以及超链接也都错误,因为jsp中的basehref中的端口是80。

http请求头中并不包含port(端口)一项,端口是和地址一起在写HOST里的。nginx可以通过配置文件设置代理发请求时host的值。host中包含的端口信息nginx只能设置为三种:默认(也就是80)、变量(nginx监听的端口或浏览器占用的端口)、常量(比如12345),也就是说,nginx并不能提取出客户端发来请求中的端口信息作为变量设置。因此,当客户端请求的host中端口可能有多个时,nginx无法通过变量提取到端口号。

另外port_in_redirect off只能让浏览器不做重定向,并不能改变nginx发请求时的端口号。

解决办法:

1.把base href去掉,如果没有basehref,浏览器会自动按照当前地址来定位,需要注意的是,如果去掉base href,那么网页中的链接就成了相对路径,如果网页在子目录的话就会出现链接错误。

2.一般这个问题不太常见,因为一般能通过外网访问的,无需再通过内网访问。但是如果有此需要,可以通过配置主机名来设置固定端口解决。在nginx的配置文件中,加一个server配置,其中server_name设置为:192.168.0.1,然后设置host $host:8080.这样一来,如果客户端输入的地址是通过内网ip192.168.0.1:8080来访问的,nginx在发请求时就会将请求头的host中端口号设置为8080.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐