redirect("/")部分链接https跳转到http

有个工程全站https。使用redirect("/")部分链接https跳转到http。spring是可以设置https不跳转到http的,jfinal怎么设置

评论区

苦丁香

2020-03-24 16:09

@JFinal 4.8目前还没解决

JFinal

2020-05-27 17:45

稍微描述一下 nginx 代理实现 "https" 时, redirect(…) 会错误重定向到 "http" 的原因:
1: nginx 代理实现 https
2: 浏览器与 nginx 用的是 https 通道
3: 但 nginx 与 jfinal 项目之间用的是 http 通道
4: 在 jfinal 的 RedirectRender.java 中通过 request.getSheme() 得到的协议值必然是 "http"。通过 request.getServerPort() 得到的必然是 nginx 与 jfinal 之间用的 port

从而,站在 jfinal 的角度得到的协议值 "http" 与 port 值都是错误的,所以需要在 nginx 上通过配置传入额外的参数来解决,这两个参数就是:
X-Forwarded-Proto、X-Forwarded-Port

配置方法如下:
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;

JFinal

2020-05-27 17:46

在 nginx 中添加配置传入 X-Forwarded-Proto、X-Forwarded-Port 两个变量以后,再下载下面的扩展代码用于自己的项目,可完美解决该问题:
http://free-download.jfinal.com/download/MyRenderFactory.zip

以上这个解决方案会做到 jfinal 5.0 中去,目前只能先下载我提供的代码解决

JFinal

2020-05-27 17:46

@苦丁香 http://free-download.jfinal.com/download/MyRenderFactory.zip

2020-06-10 16:13

要是写新的render,那写一个简单的方法也行呀,redirect的时候调用。
public static String get_url(HttpServletRequest request){
String path = request.getContextPath();
String proto = request.getHeader("X-Forwarded-Proto");
if(proto==null || "".equals(proto)){
proto = request.getScheme();
}
String basePath = proto + "://" + request.getServerName();
if(request.getServerPort()!=80 && request.getServerPort()!=443){
basePath += ":" + request.getServerPort();
}
basePath+=path+"/";
return basePath;
}
@JFinal

JFinal

2020-06-10 16:14

@谢 jfinal 的方案要考虑的事情比这多多了,建议用官方的方案,适应性更好

zzutligang

2020-06-15 17:44

很期待5.0的这个功能。4.9就解决我了几个纠结很久的问题。期待jfinal越来越好。

JFinal

2020-06-15 20:54

@zzutligang 这个方案本来是做到 4.9 中来的,有一个小问题没测试出来,所以不完美,完美的方案需要下载这个用上:
http://free-download.jfinal.com/download/MyRenderFactory.zip

JFinal

2020-07-25 17:08

后续补充, 新版本 jfinal 4.9.01 已经将上述方案添加进来,可以升级到该版本解决问题,注意仍然需要在 nignx 中添加配置才能支持,配置方法如下:
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;

具体原因见本贴前面详细的回复

热门反馈

扫码入社