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的问题的更多相关文章

  1. nginx负载均衡tomcat和配置ssl

    目录 tomcat 组件功能 engine host context connector service server valve logger realm UserDatabaseRealm 工作流 ...

  2. 正向代理 forward proxy、反向代理 reverse proxy、透明代理 transparent proxy nginx反向代理原理和配置讲解 防止外部客户机获取内部内容服务器的重定向 URL 缓存命中

    [大型网站技术实践]初级篇:借助Nginx搭建反向代理服务器 - Edison Chou - 博客园http://www.cnblogs.com/edisonchou/p/4126742.html 图 ...

  3. Nginx的HTTPS 301重定向到另一个TLD(托管在同一服务器上)没有显示出SSL警告

    我自己 example.com, .com.au, .net, .net.au, ... (8 in total). 我想所有的这些顶级域名以301的域名重定向到安全.COM域 https://www ...

  4. Nginx 的编译安装和URL地址重写

    本文转自:http://www.178linux.com/14119#rd?sukey=ecafc0a7cc4a741b573a095a3eb78af6b4c9116b74d0bbc9844d8fc5 ...

  5. nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录

    在日常运维工作中,运维人员会时常使用到nginx的反向代理,负载均衡以及缓存等功能来优化web服务性能. 废话不多说,下面对测试环境下的nginx反向代理+缓存开启+url重写+负载均衡(带健康探测) ...

  6. CentOS 5.5 Nginx+JDK+MySQL+Tomcat(jsp)成功安装案例

    在CentOS 5.5中安装Nginx+jdk+mysql+tomcat是非常容易的.只需yum安装环境包和nginx.解压安装jdk和tomcat.配置profile文件.server.xml和ng ...

  7. nginx+ssl 服务器 双向认证

    项目后台服务器采用nginx+tomcat 负载均衡架构  不久 访问协议有http升级为https 对服务器认证采用沃通的ssl证书 nginx ssl证书安装 参照沃通官方文档 他们有技术支持沟通 ...

  8. Nginx SSL TLS部署最佳实践

    本文介绍nginx在提供HTTPS时使用的一些其他配置选项. 虽然这些功能有助于优化nginx的SSL和TLS,但这不是一个完整对加固nginx的介绍. 确保您的服务器安全的最佳方法是不仅需要正确的配 ...

  9. docker,构建nginx反向代理tomcat

    Nginx实现负载均衡是通过配置nginx.conf来实现的,nginx.conf的全部内容如下: user nginx; worker_processes 1; error_log /var/log ...

随机推荐

  1. for循环以及数据类型

    一.for循环(迭代式循环) 了解:当我们在写代码时,如果代码是纯运算的代码,会占用大量的CPU,如果是I/O代码,则不会占用CPU. for i in range(10):  #可以是任意类型(字符 ...

  2. 关于ugc的一点思考

    ugc会使互联网繁荣,但依赖大众用户创造的内容质量上会存在参差不齐,这是ugc本身存在的问题. 就拿技术论坛或社区来说,好的内容不少,但质量不好的内容也很多.社区在引导用户发言的同时,也应 对用户创造 ...

  3. 2019-1-23IntelliJ IDEAget的使用教程及出现的问题

    第一条:快捷键: Ctrl+Alt+h:显示调用当前方法的所有位置. Ctrl+Alt+B:跳转到方法实现处 自动修正,我这是 Alt + L Ctrl+Enter,导入包,自动修正Ctrl+Alt+ ...

  4. 现阶段如何开始使用v-ray for unrealengine

    如何安装 因为现阶段v-ray for unrealengine还处于beta测试阶段所以你必须去https://www.chaosgroup.com/vray/unreal 申请测试资格申请完之后就 ...

  5. CY7C68013 USB接口相机开发记录 - 第四天:上位机编写1

    前面学习了USB相机硬件固件.设备驱动,可以实现USB设备识别.数据发送的功能.然后,非常重要的一部分,USB设备发出的数据,我要怎么接受,怎么查看发送的数据是否是正确的.网上百度了下,大部分人都使用 ...

  6. 09树莓派一体化安装(All-In-One Installer)智能家居平台Home Assistant

    2017-08-30 13:29:38 Raspberry Pi All-In-One Installer 全新安装树莓派系统(系统为官方的RASPBIAN STRETCH WITH DESKTOP, ...

  7. pythonweb服务器编程(二)

    Web静态服务器-1-显示固定的页面 #coding=utf-8 import socket from multiprocessing import Process def handleClient( ...

  8. flask内容之数据库的管理

    #! /usr/bin/env python # *-* coding: utf-8 *-* from flask import Flask, flash, redirect from flask i ...

  9. python之封装与扩展性

    1.封装与扩展性 封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用的代码:而外部使用者只知道一个接口(函数),只要接口(函数)名,参数不变,使用者的代码永远无需改变.这就提供了一 ...

  10. Vue(三)常用指令

    (1) v-model 双向数据绑定,一般用于表单元素 <script> window.onload=function(){ new Vue({ // el:'.itany', el:'d ...