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...

相关推荐
肠胃炎6 小时前
挂载方式部署项目
服务器·前端·nginx
曲幽10 小时前
FastAPI实战:WebSocket vs Socket.IO,这回真给我整明白了!
python·websocket·nginx·socket·fastapi·web·async·socketio
袁庭新13 小时前
M系列芯片Mac上通过Homebrew一键安装/卸载Nginx并上线项目全指南
运维·nginx·macos·袁庭新·袁庭新ai
Densen201413 小时前
发布blazor应用到Linux, 使用nginx作为WebSocket代理
linux·websocket·nginx
不是书本的小明14 小时前
Apache vs Nginx vs Tomcat 核心区别与优化
nginx·tomcat·apache
困惑阿三1 天前
客户消息及时反馈
nginx·node.js·飞书·企业微信
liurunlin8882 天前
httpslocalhostindex 配置的nginx,一刷新就报404了
运维·nginx
BullSmall2 天前
Nginx负载均衡会话保持配置指南
运维·nginx·负载均衡
你才是臭弟弟2 天前
Nginx部署前后端
运维·nginx