Nginx代理后getServerName()方法获取不到域名

当使用了Nginx代理,在Java中出现使用HttpServletRequestgetServerName()方法获取不到域名,而是127.0.0.1的情况,Nginx和应用在同一台服务器上

复现

首先修改本地的hosts文件来模拟域名访问

test.com添加到配置中

然后写一个接口来输出getServerName()方法

java 复制代码
 @RequestMapping("/url")
    public String url(HttpServletRequest request)  {
        System.out.println(request.getScheme());
        System.out.println(request.getServerName());
        System.out.println(request.getContextPath());
        return  request.getScheme() + "://" + request.getServerName() + request.getContextPath();
    }

访问http://test.com:8002/url后看到接口返回http://test.com

随后开启一个Nginx,并配置好接口的代理

arduino 复制代码
 location ~ /url {
      proxy_pass  http://127.0.0.1:8002;
 }

随后通过Nginx去访问接口http://test.com/url

会发现返回的结果是http://127.0.0.1

原因

问题的原因是经过Nginx后,没有把http请求里的host转发过来,获取到的是Nginx的ip

bash 复制代码
 location ~ /url {
 	#转发host信息
 	proxy_set_header  Host $host;
    proxy_pass  http://127.0.0.1:8002;
 }

通过这一行参数可以将host里的信息也转发过来,作用是把原http请求的header中的host字段也放到转发的请求

重新访问后可以发现返回的是域名了

命令的作用

proxy_set_header允许重新定义或追加字段到请求头,然后再转发,值可以是文本、变量或者组合

当前配置如果没有指定,会继承上一个配置文件的设置

默认的设置是

ini 复制代码
proxy_set_header Host       $proxy_host;
proxy_set_header Connection close;

$proxy_host就是代理服务器的host,所有会看到上述127.0.0.1的出现

官网中还给出了两个变量$host$http_host,关于这两个参数的区别官网也中给出了解释

如果不想改变请求头中host的值,可以使用$http_host

但是如果客户端请求头没有带host参数的话,转发就不会携带host

一般是使用$host变量,它的值等于host请求报头字段中的服务器名,如果这个字段不存在,则等于Nginx的server_name

也可以自定义一个host来转发

ini 复制代码
#代理服务器host
proxy_set_header Host $proxy_host;
#客户端请求host
proxy_set_header Host $host;
proxy_set_header Host $http_host;
#自定义
proxy_set_header Host abc.com;

官网解释:nginx.org/en/docs/htt...

相关推荐
叶北辰CHINA30 分钟前
nginx反向代理,负载均衡,HTTP配置简述(说人话)
linux·运维·nginx·http·云原生·https·负载均衡
Lansonli2 小时前
云原生(四十八) | Nginx软件安装部署
nginx·云原生·ecs服务器
加油,旭杏9 小时前
【中间件学习】fastCG介绍和使用
学习·nginx·fastcgi
苹果醋312 小时前
大模型实战--FastChat一行代码实现部署和各个组件详解
java·运维·spring boot·mysql·nginx
tanxiaomi19 小时前
vue 不是spa 单页面应用吗? 配置路由工作模式为history 后 ,为什么配置Nginx的 try_files 可以根据url 找到对应的文件?
前端·vue.js·nginx
twins352020 小时前
配置Nginx以支持通过HTTPS回源到CDN
网络·nginx·https
astuv20 小时前
在树莓派上部署开源监控系统 ZoneMinder
linux·nginx·树莓派·监控·摄像头·zoneminder·apache2
加油,旭杏1 天前
【中间件学习】Nginx快速入门(为了配置一个项目)
学习·nginx·中间件
-XWB-2 天前
【安全漏洞-中间件】nginx版本号屏蔽
运维·nginx·中间件
刘重洋2 天前
解决nginx+tomcat宕机完美解决方案
nginx·tomcat·firefox