Nginx代理后getServerName()方法获取不到域名
<p>当使用了Nginx代理,会出现Java用<code>HttpServletRequest</code>的<code>getServerName()</code>方法获取不到域名,而是127.0.0.1的情况</p><p><strong>复现</strong></p>
<p>首先修改本地的hosts文件来模拟域名访问</p>
<p>将<code>test.com</code>添加到配置中</p>
<p>然后写一个接口来输出<code>getServerName()</code>方法</p>
<pre><code class="language-java"> @RequestMapping("/url")
public String url(HttpServletRequest request){
System.out.println(request.getScheme());
System.out.println(request.getServerName());
System.out.println(request.getContextPath());
returnrequest.getScheme() + "://" + request.getServerName() + request.getContextPath();
}
</code></pre>
<p>访问<code>http://test.com:8002/url</code>后看到接口返回<code>http://test.com</code></p>
<p>随后开启一个Nginx,并配置好接口的代理</p>
<pre><code> location ~ /url {
proxy_passhttp://127.0.0.1:8002;
}
</code></pre>
<p>随后通过Nginx去访问接口<code>http://test.com/url</code></p>
<p>会发现返回的结果是<code>http://127.0.0.1</code></p>
<p><strong>原因</strong></p>
<p>问题的原因是经过Nginx后,没有把http请求里的host转发过来,获取到的是Nginx的ip</p>
<pre><code> location ~ /url {
#转发host信息
proxy_set_headerHost $host;
proxy_passhttp://127.0.0.1:8002;
}
</code></pre>
<p>通过这一行参数可以将host里的信息也转发过来,作用是把原http请求的header中的host字段也放到转发的请求</p>
<p>重新访问后可以发现返回的是域名了</p>
<p><strong>命令的作用</strong></p>
<p><code>proxy_set_header</code>允许重新定义或追加字段到请求头,然后再转发</p>
<p>值可以是文本、变量或者组合</p>
<p>当前配置如果没有指定,会继承上一个配置文件的设置</p>
<p>默认的设置是</p>
<pre><code>proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
</code></pre>
<p><code>$proxy_host</code>就是代理服务器的host,所有会看到上述<code>127.0.0.1</code>的出现</p>
<p>官网中还给出了两个变量<code>$host</code>和<code>$http_host</code>,关于这两个参数的区别官网也中给出了解释</p>
<p>如果不想改变请求头中host的值,可以使用<code>$http_host</code></p>
<p>但是如果客户端请求头没有带host参数的话,转发就不会携带host</p>
<p>推荐是使用<code>$host</code>变量,它的值等于host请求报头字段中的服务器名,如果这个字段不存在,则等于主服务器名</p>
<p>也可以自定义一个host来转发</p>
<pre><code>#代理服务器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;
</code></pre>
<p>官网地址:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header</p>
</div>
<div id="MySignature" role="contentinfo">
<p>本文来自博客园,作者:阿弱,转载请注明原文链接:https://www.cnblogs.com/aruo/p/16034891.html</p><br><br>
来源:https://www.cnblogs.com/aruo/p/16034891.html
頁:
[1]