转发

通过负载均衡访问服务端导致https重定向到http
网友遇到的问题:https://www.cnblogs.com/niuxiaozu/p/16468509.html
总结:他的解决办法是给springboot的yml增加server.tomcat.useRelativeRedirects为true
让程序返回/,这样外层nginx不管是返回绝对还是相对路径都不会有问题。

tomcat的org.apache.catalina.connector.Response的sendRedirect方法逻辑:
参见:https://www.cnblogs.com/niuxiaozu/p/16468509.html
如果协议为空或为http1.0则返回绝对路径
如果server.tomcat.useRelativeRedirects为false(tomcat默认就是false)则返回绝对路径
否则返回相对路径
总结:正常协议为http1.1并且设置server.tomcat.useRelativeRedirects为true则返回
相对路径,负责返回绝对路径
注:
1、curl使用http1.0的写法为curl --http1.0 http://a/login -v
http1.1写法为curl --http1.1 http://a/login -v
2、springboot的tomcat的redirect使用相对路径(默认使用绝对路径),
需要在yml里定义server.tomcat.use-relative-redirects=true
如果是传统tomcat配置参见
https://blog.csdn.net/xing930408/article/details/111225064
https://tomcat.apache.org/tomcat-11.0-doc/config/systemprops.html
即定义环境变量-Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE=true

Response的toAbsolute(String location)返回绝对路径方法逻辑:
如果入参是//开头(比如//xxx)则拼接类型http:拼接location,比如http://xxx
如果入参是/开头或不含schema(比如/login或login)则
拼接http(https)😕/servername:port/location
如果入参不是上面两种情况(比如http://a/login)即这里是绝对路径则直接返回location

nginx重写location规则:
参见:
https://nginx.org/en/docs/http/ngx_http_core_module.html#port_in_redirect
假定tomcat返回响应头里是location: http://ip:port/uri
1、nginx针对uri部分根据nginx里配置的该怎么替换就怎么替换
参见:https://blog.51cto.com/u_16608712/10070053
2、nginx针对port部分根据port_in_redirect做替换,该变量
如果为on(默认就是on)则替换为nginx端口号,否则替换为80端口
3、nginx根据absolute_redirect返回绝对还是相对路径,
如果为on(默认就是on)则返回绝对路径(即把uri前面都砍掉,使用
请求头的Host值拼接后面替换后的uri)
如果为off就返回替换后的uri,此时规则2没用了
总结:默认配置下nginx会返回正确的域名部分+替换后的uri部分

posted @   bplan2010  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示