首页 > 其他分享 >redirect跳转https变为http问题的深入思考【转】

redirect跳转https变为http问题的深入思考【转】

时间:2024-11-08 17:07:54浏览次数:1  
标签:redirect http nginx Location https 跳转

背景
服务部署以及跳转展示如下:

 

用户https请求通过阿里云负载通过http到指定应用,应用返回跳转路径(状态为302),但跳转路径为http(不为https),所以访问不了
2.1 跳转伪代码:

// ModelAndView
mv.setViewName(WebCst.REDIRECT + "/admin/sso/login");
1
2
2.2 浏览器跳转截图


结论总结
用nginx负载返回给浏览器的Location为https是因为nginx做了处理,关键配置见下

proxy_set_header Host $host;
proxy_redirect http:// https://;
1
2
1.1 用arthas的trace命令观察线上,应用直接返回的Location为http://localhost:8232/exp-admin/admin/sso/login

watch org.apache.catalina.connector.Response toAbsolute -x 2
1
将nginx替换成SLB后,返回给浏览器的Loaction变为http是因为SLB缺少相应的配置
2.1 SLB相关配置:https://help.aliyun.com/document_detail/97646.html

跳转的Location是如何生成的
后台是以springboot进行开发的,下面的分析都是基于springboot方式进行

先展示一下springmvc的工作原理

2.1 我们跳转设置为:mv.setViewName(WebCst.REDIRECT + “/admin/sso/login”); 结合上图,猜测根据视图进行跳转

2.2 视图解析器ContentNegotiatingViewResolver通过resolveViewName解析视图,得到跳转视图:RedirectView,调用其render进行跳转

以RedirectView#render进行跳转分析

3.1 下图显示以是否兼容http1.0(http10Compatible) 进行区分获取Location
(1)默认是兼容http1.0,故response.sendRedirect(encodedURL);

(2)response.sendRedirect(encodedURL)最终会触发到tomcat的org.apache.catalina.connector.Response的sendRedirect方法


public void sendRedirect(String location, int status) throws IOException {
locationUri = toAbsolute(location);
setStatus(status);
setHeader("Location", locationUri); //设置跳转的location
}
1
2
3
4
5
3.2 跳转Location生成的入口:org.apache.catalina.connector.Response#toAbsolute

// 从request中获取协议、IP、端口信息,然后和设置的相对路径拼接起来
protected String toAbsolute(String location) {
String scheme = request.getScheme();
String name = request.getServerName();
int port = request.getServerPort();
redirectURLCC.append(scheme, 0, scheme.length());
redirectURLCC.append("://", 0, 3);
redirectURLCC.append(name, 0, name.length());
if ((scheme.equals("http") && port != 80)
|| (scheme.equals("https") && port != 443)) {
redirectURLCC.append(':');
String portS = port + "";
redirectURLCC.append(portS, 0, portS.length());
}
redirectURLCC.append(location, 0, location.length());
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Request中协议信息在哪生成


根据调用栈发现,在ConnectionHandler处理连接时,根据SocketEvent进行区别处理


在Http11Processor处理OPEN_READ事件时会对请求进行预处理
public SocketState service(SocketWrapperBase<?> socketWrapper)
throws IOException {
prepareRequestProtocol(); //设置为http1.1
prepareRequest(); //处理协议(http或者https)
getAdapter().service(request, response); //调用后面Dispatcher
}

在prepareRequest判断是否开启SSL,如果开启则为https
private void prepareRequest() throws IOException {
if (protocol.isSSLEnabled()) {
request.scheme().setString("https");
}
}

nginx对跳转的设置
nginx官网对跳转描述:https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect
设置在代理服务器响应的“Location” 头字段中更改的文本。
2.1 假设代理服务器返回头字段 “ Location: http://localhost:8000/two/some/uri/”。该指令proxy_redirect http://localhost:8000/two/ http://frontend/one/; 将此字符串重写为“ Location: http://frontend/one/some/uri/”。
2.2 在可以正常跳转的nginx上的配置为如下,将http转换成Https
proxy_set_header Host $host;
proxy_redirect http:// https://;

本地应用SSL配置:https://zhuanlan.zhihu.com/p/31385073
#https端口号.
server.port: 443
#证书的路径.
server.ssl.key-store: tomcat.keystore
#证书密码,请修改为您自己证书的密码.
server.ssl.key-store-password: 123456
#秘钥库类型
server.ssl.keyStoreType: PKCS12
#证书别名
server.ssl.keyAlias: tomcat

转自

redirect跳转https变为http问题的深入思考-CSDN博客
https://blog.csdn.net/weixin_40803011/article/details/121560609

 

标签:redirect,http,nginx,Location,https,跳转
From: https://www.cnblogs.com/paul8339/p/18535470

相关文章

  • 结合Poco库的一个httpdown方法
    poco库很丰富,这里列举了生成guide,httpdownload的2个方法。下载的时候,顺便打印了当前下载进度。 #include<sstream>#include<iomanip>#include<istream>#include<ostream>#include<iostream>#include<fstream>//ofstream#include<Poco/P......
  • lua插件之----【luaHttp 网页类】
    API列表(自写API,供自查询。对您无用,不要看了) 接口原型说明luaHttp.get(config)访问网址,注意它不是GET方式。可以POST数据luaHttp.upload(url,filePath,cookies)上传文件luaHttp.split(url)拆分urlluaHttp.isUrl(url)判断是否是网址格式luaHttp.queryT......
  • 海康私有化视频平台EasyCVR视频分析设备平台流媒体协议RTMP、HTTP-FLV、HLS的简单对比
    在当今的数字化世界中,视频流协议的选择对于确保流畅、高效的视频传输至关重要。随着互联网技术的快速发展,直播和视频点播服务已经成为人们日常生活中不可或缺的一部分。无论是安防监控、在线教育、远程会议还是娱乐直播,用户对于视频流的实时性、稳定性和兼容性都有着极高的要求。......
  • Qt实现Http请求
    Qt中使用QNetworkAccessManager类来实现Http相关请求,本文介绍HttpGet请求的简单实用方法。下面是Qt中进行Http请求的简单步骤:定义QNetworkAccessManager指针及槽函数创建QNetworkAccessManager对象并关联槽函数在类的析构函数中删除QNetworkAccessManager对象实现槽函数调......
  • HTTP中的状态码
    HTTP中的状态码HTTP中的状态码状态码的作用状态码的职责是当客户端向服务器发送请求时,描述返回的请求结果,借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。类别原因1XX信息性状态码接收到的请求正在处理中2XX成功状态码请求正常处理完毕3......
  • cn.hutool.http.HttpResponse 实现http请求
    前提引入hutool依赖具体实现//发送GET请求publicstaticHttpResponsesendGetRequest(Stringurl,Map<String,List<String>>httpHeaders){HttpResponseresponse=HttpRequest.get(url).header(httpHeaders).ex......
  • angular—如何制作一个HTTP拦截器
    原文链接:angular—如何制作一个HTTP拦截器–每天进步一点点HTTP拦截器在开发过程中十分常见。在构建项目时,最好就直接创建一个HTTP拦截器,否则遇到以下几种问题,再进行改动就会十分浪费时间。需要给所有的请求修改请求地址。需要给所有的请求参数设置新的请求报文首部。需要监......
  • 使用 vscode 简单配置 ESP32 连接 Wi-Fi 每日定时发送 HTTP 和 HTTPS 请求
    最新博客文章链接文字更新时间:2024/11/07由于学校校园网,如果长时间不重新登陆的话,网速会下降,所以想弄个能定时发送HTTP请求的东西。由于不想给路由器刷系统,也麻烦。就开始考虑使用局域网内的服务器,不过由于服务器没有Wi-Fi模块,也不想搞USB无线wifi网卡,就想着干脆用单......
  • 哪些网站可以申请免费的纯IP地址https证书
    申请免费纯IP地址HTTPS证书,您可以按照以下步骤进行:一、选择证书颁发机构(CA)目前,虽然一些大型云服务提供商(如阿里云、华为云、腾讯云等)已经取消了免费一年期SSL证书的供应,但仍有一些CA机构提供免费版本的IP地址HTTPS证书。二、在JoySSL申请免费证书访问JoySSL官网:https://www.jo......
  • 常见 HTTP 状态码分类和解释及服务端向前端返回响应时的最完整格式
    目前的开发项目,准备明年的国产化,用了十年的自研系统借这个机会全部重写,订立更严格的规范,这里把返回格式及对应状态码记录一下。常见HTTP状态码及解释HTTP状态码用于表示客户端请求的响应状态,它们分为五类:2xx表示成功,3xx表示重定向,4xx表示客户端错误,5xx表示服务......