标签:set http header request 域名 代理 Nginx host proxy
当使用了Nginx代理,会出现Java用HttpServletRequest
的getServerName()
方法获取不到域名,而是127.0.0.1的情况
复现
首先修改本地的hosts文件来模拟域名访问
将test.com
添加到配置中
然后写一个接口来输出getServerName()
方法
@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,并配置好接口的代理
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
location ~ /url {
#转发host信息
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8002;
}
通过这一行参数可以将host里的信息也转发过来,作用是把原http请求的header中的host字段也放到转发的请求
重新访问后可以发现返回的是域名了
命令的作用
proxy_set_header
允许重新定义或追加字段到请求头,然后再转发
值可以是文本、变量或者组合
当前配置如果没有指定,会继承上一个配置文件的设置
默认的设置是
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请求报头字段中的服务器名,如果这个字段不存在,则等于主服务器名
也可以自定义一个host来转发
#代理服务器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;
官网地址:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header
标签:set,http,header,request,域名,代理,Nginx,host,proxy 来源: https://www.cnblogs.com/aruo/p/16034891.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。