轉發

bplan2010發表於2024-07-26

透過負載均衡訪問服務端導致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部分

相關文章