解决nginx https代理tomcat redirect问题
解决nginx https代理tomcat redirect问题
问题描述
http服务器:nginx,10.10.10.95,版本:1.10.1,请求使用协议为https,端口为18080。
服务服务器:tomcat,10.10.10.92,使用协议为http,端口为8080。
问题:当在业务服务器使用sendRedirect时,tomcat响应302给nginx,nginx再响应给浏览器,默认情况下,nginx响应给浏览器的location会将schema换为http,端口为:80。
这就导致浏览器redirect后,访问不到正确资源。
过程举例:
浏览器输入:https://10.10.10.95:18080/redirect_test.do
redirect_test.do中执行sendRedirect("/welcome.do")
浏览器接收到的redirect响应(302)中location为http://10.10.10.95/welcome.do
浏览器跳到http://10.10.10.95/welcome.do,发现访问不了
解决方案
修改nginx配置,关键配置如下:
server{
listen 18080;
server_name ecsc;
ssl on;
ssl_certificate /root/ssl/test.crt;
ssl_certificate_key /root/ssl/test_nopass.key;
error_page 497 https://$host:8080;
access_log /var/log/nginx/access.log main;
proxy_redirect http:// $scheme://;
port_in_redirect on;
location ~/druid{
return 404;
}
location /{
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
expires 10d;
proxy_pass http://console.eayun.com ;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
}
说明:
使用proxy_redirect将location中的协议转换为请求nginx的协议。
使用port_in_redirect on指示nginx使用请求的端口,而不是使用默认端口。
proxy_set_header Host $host:$server_port;很关键,我也不明白为啥,不设置,端口为变为80。
————————————————
版权声明:本文为CSDN博主「juncke」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/juncke/article/details/52539175
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器