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

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);
            }
        }

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

时间: 2024-10-13 12:13:14

Nginx SSL 结合Tomcat 重定向URL变成HTTP的问题的相关文章

Nginx+LAT(apache+tomcat)的实现和使用memcached保存tomcat的session会话

Nginx+LAT(Apache+tomcat)的实现和Apache反向代理和负载均衡tomcat的不同方式以及使用memcached保存tomcat的session会话 一.Nginx+LAT(Apache+tomcat)的环境结构; 1.Nginx +Apache实现负载均衡用户请求至tomcat,其中Nginx是负载均衡调度器,Apache和tomcat在同一台机器上,Apache将关于JSP的请求发送至tomcat. 2.实验结构图: 3.环境介绍,在两台CentOS7上都安装Tomca

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

本文转自:http://www.178linux.com/14119#rd?sukey=ecafc0a7cc4a741b573a095a3eb78af6b4c9116b74d0bbc9844d8fc5e8b50b3fc807541ae53fd06c67ac4f4adaae6981 在此只是做个笔记给自己看的. Nginx专题: 从编译安装到URL重写 前言 环境介绍 Nginx介绍 编译安装Nginx 配置文件解释 main和event{}的配置 http{}的基本配置 配置Nginx 搭建一个

HTTPS协议介绍—使用Nginx+SSL实现部署与性能优化

一.HTTPS协议简介 HTTPS 可以认为是 HTTP + TLS.HTTP 协议大家耳熟能详了,目前大部分 WEB 应用和网站都是使用 HTTP 协议传输的. TLS 是传输层加密协议,它的前身是 SSL 协议,最早由 netscape 公司于 1995 年发布,1999 年经过 IETF 讨论和规范后,改名为 TLS.如果没有特别说明,SSL 和 TLS 说的都是同一个协议. HTTP 和 TLS 在协议层的位置以及 TLS 协议的组成如下图: TLS 协议主要有五部分:应用数据层协议,握

nginx反向代理tomcat提示13 permission denied while connecting to upstream

nginx反向代理tomcat提示13 permission denied while connecting to upstream,网上很多都是说13 permission denied while reading to upstream,这是两个完全不同的错误,我遇到的如下截图: 查看selinux日志发现错误: 后来发现是selinux的问题,于是先关掉selinux:setenforce 0:然后再访问果然好使. 于是启用selinux,再执行下面的命令,修改selinux的值: set

nginx + SSL优化配置

nginx + SSL优化配置: 1 #http段添加如下配置项: 2 3 http { 4 5 ssl_prefer_server_ciphers on; #设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件. 6 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #协议安全设置 7 ssl_ciphers ALL:!kEDH!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; #加密套件 ssl_ciph

160512、nginx+多个tomcat集群+session共享(windows版)

第一步:下载nginx的windows版本,解压即可使用,点击nginx.exe启动nginx 或cmd命令 1.启动: D:\nginx+tomcat\nginx-1.9.3>start nginx或D:\nginx+tomcat\nginx-1.9.3>nginx.exe注:建议使用第一种,第二种会使你的cmd窗口一直处于执行中,不能进行其他命令操作. 2.停止: D:\nginx+tomcat\nginx-1.9.3>nginx.exe -s stop或D:\nginx+tomca

NGINX模块开发 之 验证URL参数

作者:邹祁峰 邮箱:[email protected] 博客:http://blog.csdn.net/qifengzou 日期:2014.05.26 16:45 转载请注明来自"祁峰"的CSDN博客 要求在浏览器地址栏中输入"localhost/login?user=qifeng&passwd=123456",并在浏览器上显示验证结果(Success 或 Failed).以下是在NGINX中添加一个LOGIN模块的整个处理过程. 1 修改配置 修改配置文件

重定向URL

重定向的原因有哪些?[1]网址变更了[2]权限不够 [1]网址变更了 [举例]以google为例,之前我们可以访问www.google.cn,但是后来Z.F不让我们访问它了,那么google公司为了避免用户无法访问google的搜索引擎,就做了1个引导用户的跳转. 当你在浏览器内输入www.google.cn,此时显示如下图: 这里引导用户去点击中心区域的图片,并且你看,在图片内也做了比较负责任的说明"请收藏我们的网址:google.com.hk" 当你点击了中心区域的图片,浏览器此时

haproxy配置直接重定向url

在邮件列表看到有个人问haproxy能否在接到一个请求时选择一个后端服务器,然后301重定向url .主要原因是他有5个1G的出口,这样就能充分利用其带宽.测试了一下是可以的 frontend free        bind *:80        default_backend lvs2 backend lvs2 mode http option forwardfor header ORIG_CLIENT_IP server free174 10.253.3.16:8081 redir ht