Nginx SSL 结合Tomcat 重定向URL变成HTTP的问题
http://www.siven.net/posts/d925bb5d.html
***********************************************
问题描述
由于要配置服务器(Nginx + Tomcat)的SSL的问题(Nginx同时监听HTTP
和HTTPS
),但是,如果用户访问的是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);
测试结果与重定向一致, 无异常情况;
测试总结
实际应用场景中,如果要求HTTP
与HTTPS
协议共存的时候(请求的协议与响应的协议一致)就会出现HTTP
请求被强转为HTTPS
,尝试将Nginx配置proxy_redirect http:// https://;
注释,最终使用HTTPS
协议亦无法正常跳转;
实践二:Tomcat新增配置
不修改Nginx的情况下, 仅对Tomcat配置进行调整
在server.xml
的Engine
模块下面配置多一个以下的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的问题的更多相关文章
- nginx负载均衡tomcat和配置ssl
目录 tomcat 组件功能 engine host context connector service server valve logger realm UserDatabaseRealm 工作流 ...
- 正向代理 forward proxy、反向代理 reverse proxy、透明代理 transparent proxy nginx反向代理原理和配置讲解 防止外部客户机获取内部内容服务器的重定向 URL 缓存命中
[大型网站技术实践]初级篇:借助Nginx搭建反向代理服务器 - Edison Chou - 博客园http://www.cnblogs.com/edisonchou/p/4126742.html 图 ...
- Nginx的HTTPS 301重定向到另一个TLD(托管在同一服务器上)没有显示出SSL警告
我自己 example.com, .com.au, .net, .net.au, ... (8 in total). 我想所有的这些顶级域名以301的域名重定向到安全.COM域 https://www ...
- Nginx 的编译安装和URL地址重写
本文转自:http://www.178linux.com/14119#rd?sukey=ecafc0a7cc4a741b573a095a3eb78af6b4c9116b74d0bbc9844d8fc5 ...
- nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录
在日常运维工作中,运维人员会时常使用到nginx的反向代理,负载均衡以及缓存等功能来优化web服务性能. 废话不多说,下面对测试环境下的nginx反向代理+缓存开启+url重写+负载均衡(带健康探测) ...
- CentOS 5.5 Nginx+JDK+MySQL+Tomcat(jsp)成功安装案例
在CentOS 5.5中安装Nginx+jdk+mysql+tomcat是非常容易的.只需yum安装环境包和nginx.解压安装jdk和tomcat.配置profile文件.server.xml和ng ...
- nginx+ssl 服务器 双向认证
项目后台服务器采用nginx+tomcat 负载均衡架构 不久 访问协议有http升级为https 对服务器认证采用沃通的ssl证书 nginx ssl证书安装 参照沃通官方文档 他们有技术支持沟通 ...
- Nginx SSL TLS部署最佳实践
本文介绍nginx在提供HTTPS时使用的一些其他配置选项. 虽然这些功能有助于优化nginx的SSL和TLS,但这不是一个完整对加固nginx的介绍. 确保您的服务器安全的最佳方法是不仅需要正确的配 ...
- docker,构建nginx反向代理tomcat
Nginx实现负载均衡是通过配置nginx.conf来实现的,nginx.conf的全部内容如下: user nginx; worker_processes 1; error_log /var/log ...
随机推荐
- 多表查询、可视化工具、pymysql模块
create table dep( id int primary key auto_increment, name varchar(16), work varchar(16) ); create ta ...
- Stanford CoreNLP使用需要注意的一点
1.Stanford CoreNLP maven依赖,jdk依赖1.8 <dependency> <groupId>edu.stanford.nlp</groupId&g ...
- Spring使用笔记(三) 高级装配
高级装配 一.环境与Profile 一)配置profile bean 环境的改变导致配置改变(需求:通过环境决定使用哪个bean),可以通过Spring的Profile解决. Profile可以在程序 ...
- PostgreSQL数组使用
原文:https://my.oschina.net/Kenyon/blog/133974 1.数组的定义 不一样的维度元素长度定义在数据库中的实际存储都是一样的,数组元素的长度和类型必须要保持一致, ...
- springboot2、mybatis-plus3 一行配置实现打印sql最终填充的参数值
在application.yml中添加: # 配置slq打印日志 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.st ...
- (转)java创建对象的步骤
关于对象的创建过程一般是从new指令(我说的是JVM的层面)开始的(具体请看图1),JVM首先对符号引用进行解析,如果找不到对应的符号引用,那么这个类还没有被加载,因此JVM便会进行类加载过程.符号引 ...
- Android Studio 解决ADB检测不到手机导致无法连接的问题
ADB的全称是Android Debug Bridge,是用来管理模拟器和真机的通用调试工具. 开USB调试 方法:手机设置 - 开发人员选项 - USB调试 - 勾选(开发者调试被隐藏了,在关于手机 ...
- fatal: You are not currently on a branch. 问题解决
fatal: You are not currently on a branch. 解决 注:亲试,这种方法会把本地的修改给冲掉,所以事先一定要备份下文档,之后覆盖,重新上传或pull即可:解决方法: ...
- CSS单位和颜色表
- 阿里云CentOS 7无外网IP的ECS访问外网(配置网关服务器)
说明: 1.必须要有一台机器具有外网IP的ECS. 2.如果不想配置具有外网IP的ECS时,可以购买NAT网关,但需要钱,贵.下面会说明NAT网关的配置. 3.最后吐槽一下阿里云VPC网关导致不能按照 ...