分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

Nginx SSL 结合Tomcat 重定向URL变成HTTP的问题

发布时间:2023-09-06 02:24责任编辑:彭小芳关键词:暂无标签

http://www.siven.net/posts/d925bb5d.html

***********************************************

问题描述

由于要配置服务器(Nginx + Tomcat)的SSL的问题(Nginx同时监听HTTPHTTPS),但是,如果用户访问的是HTTPS协议,然后Tomcat进行重定向的时候,却变成了HTTP.

逐步实践过程

在网上找了一些资料,有些是通过修改Nginx配置即可解决,也有只对Tomcat配置进行调整解决的… 各说不一,以下对尝试的解决过程进行记录:

实践一:Nginx新增配置

HTTP协议制转为https

Nginx代理的配置,要添加以下内容:

location / {
???proxy_pass http://test-server;
???proxy_set_header Host $host;
???proxy_set_header X-Real-IP $remote_addr;
???proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

???# 必须配置:
???proxy_set_header X-Forwarded-Proto ?$scheme;

???# 作用是对发送给客户端的URL进行修改, 将http协议强制转为https
???proxy_redirect ??http:// https://;
}

为了方便测试proxy_redirect强制转换, http(80)、https(443)共存
server {
???listen ?80; ?
???listen ?443 ssl; ?
???...
}

重定向测试

  • JAVA CODE:

HttpServletResponse resp = (HttpServletResponse)response;resp.sendRedirect("/static/html/index.html");

使用HTTP协议访问nginx代理地址之后,URL被重定向为HTTPS协议了, 如下图所示:

当然直接使用HTTPS协议访问, 肯定也是没有问题的,如下图所示:

转发测试

  • JAVA CODE:

HttpServletResponse resp = (HttpServletResponse)response;req.getRequestDispatcher("/static/html/index.html").forward(request, response);

测试结果与重定向一致, 无异常情况;

测试总结

实际应用场景中,如果要求HTTPHTTPS协议共存的时候(请求的协议与响应的协议一致)就会出现HTTP请求被强转为HTTPS,尝试将Nginx配置proxy_redirect http:// https://;注释,最终使用HTTPS协议亦无法正常跳转;

实践二:Tomcat新增配置

不修改Nginx的情况下, 仅对Tomcat配置进行调整

server.xmlEngine模块下面配置多一个以下的Valve

<Valve ?className="org.apache.catalina.valves.RemoteIpValve" ????????remoteIpHeader="X-Forwarded-For" ????????protocolHeader="X-Forwarded-Proto" ????????protocolHeaderHttpsValue="https"/>

重定向测试

使用HTTPS协议访问时,最终被重定向到HTTP

转发测试

使用HTTPS协议访问,转发动作未出现问题

测试总结

重定向的时候, HTTPS协议被转为HTTP,测试结果不通过。

实践三:终极方案

Nginx 配置

对过程一Nginx配置进行调整注释或删除proxy_redirect,最终如下:

location / {
???proxy_pass http://test-server;
???proxy_set_header Host $host;
???proxy_set_header X-Real-IP $remote_addr;
???proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

???# 必须配置:
???proxy_set_header X-Forwarded-Proto ?$scheme;
}


Tomcat 配置

参看:Tomcat配置

测试过程

HTTP协议请求
HTTPS协议请求

测试结果

测试通过,无论使用HTTP访问还是HTTPS访问,最终返回都是根据请求的协议进行响应,问题解决。

完整配置

  • Nginx
worker_processes ?1;

events {
???worker_connections ?1024;
}


http {
???include ??????mime.types;
???default_type ?application/octet-stream;

???sendfile ???????on;

???keepalive_timeout ?65;

???upstream test-server { ?
???????server 10.15.16.6:8280 weight=1;
???}

???server {
???????listen ??????80;
???????listen ??????443 ssl;
???????server_name ?localhost;

???????#ssl_certificate ?????cert.pem;
???????#ssl_certificate_key ?cert.key;

???????ssl_certificate ?????server.crt;
???????ssl_certificate_key ?server.key;

??????# ssl_session_cache ???shared:SSL:1m;
??????#ssl_session_timeout ?5m;

??????# ssl_ciphers ?HIGH:!aNULL:!MD5;
??????# ssl_prefer_server_ciphers ?on;


???????location / {
???????????proxy_pass http://test-server;
???????????proxy_set_header Host $host;
???????????proxy_set_header X-Real-IP $remote_addr;
???????????proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

???????????proxy_set_header X-Forwarded-Proto ?$scheme;
???????????# proxy_redirect ??http:// https://;
???????}

???}

}

//处理代码段
 ???????domainName = request.getRequestURL().toString(); ???????String X_Forwarded_Proto = httpRequest.getHeader("X-Forwarded-Proto"); ???????if(StringUtils.isNotBlank(X_Forwarded_Proto)){ ???????????if(X_Forwarded_Proto.toLowerCase().contains("https") && !domainName.toLowerCase().startsWith("https://")){ ???????????????domainName = "https://" + domainName.substring(7); ???????????} ???????}

Nginx SSL 结合Tomcat 重定向URL变成HTTP的问题

原文地址:https://www.cnblogs.com/zhao1949/p/10024854.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved