这篇文章的内容来源 2016年的两篇文章,当时使用 Nginx 反向代理 Tomcat/Resin 出现错误,发现是 proxy_redirect 指令导致的问题,错误的原因令人印象很深刻。
错误是因为没有详细查看指令和参数的含义,直接照搬他人的示例配置,这种方式是不可取的,因为你们的环境与需求可能是不同的,同样参数配置可能会适合作者但未必能适合你,所以示例配置仅能作参考,务必要结合自己的实际需求做出相应调整。
某台测试机安装有 nginx 与 tomcat ,并使用nginx 反向代理 tomcat ,错误表现为访问服务器时会重定向为 tomcat的地址,因为tomcat 是内网服务器地址,最终浏览器返回无法链接错误信息,查看HTTP响应信息 Location 为 http://127.0.0.1:8204/ 。
server
{
#... 其它配置项省略
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8204/;
proxy_redirect off; #注意这里
}
#... 其它配置项省略
}
关于参数含义请参考这篇文章 Nginx Proxy反向代理
使用 nginx 反向代理 tomcat 或者 resin服务器,如果出现上述的问题。
请检查nginx配置文件中 proxy_redirect指令是否使用了off选项 ,如果使用了off选项,则关闭所有的 proxy_redirect 指令。
在不确定off参数是否有副作用的情况下可以使用默认选项,即 "proxy_redirect default;" 。
语法: proxy_redirect [ default|off|redirect replacement ]
默认值: proxy_redirect default
使用字段: http, server, location
功能: 这个指令用于修改从被代理服务器响应头中的"Location"和"Refresh"字段。
假设
被代理服务器返回的 Location字段为:http://localhost:8080/3g/video
设置
proxy_redirect http://localhost:8080/3g/ http://demo.com/m/;
那么
Location 字段将 重写为 http://demo.com/m/video 。
将根据location和proxy_pass 指令的设置来决定,例如下列两个配置等效的。
location /m/ {
proxy_pass http://upstream:port/3g/;
proxy_redirect default;
}
location /m/ {
proxy_pass http://upstream:port/3g/;
proxy_redirect http://upstream:port/3g/ /m/;
}
将在这个字段中禁止所有的 proxy_redirect指令:
proxy_redirect off;
proxy_redirect default;
proxy_redirect http://localhost:8080/ /;