nginx+tomcat request.getScheme 获取不到https

nginx+tomcat request.getScheme 获取不到https

月光魔力鸭

2020-09-15 10:47 阅读 1940 喜欢 0 nginx+tomcat request.getScheme

项目为nginx+tomcat 部署的,由于需要https环境,本来直接配置nginx https就可以了,结果在jsp 中获取request.getScheme 怎么都是http .. 可把我这个假运维愁坏了。

一般来说,nginx+tomcat ,只需要配置nginx即可,浏览器与nginx之间通信使用https ,nginx 与 tomcat 之间还是http连接 ,可是..可是 拿不到request.getScheme 的https 数据啊。

尝试了几个,nginx直接加proxy_set_header X-Forwarded-Proto https; 也不管用。

尝试了 tomcat+nginx 都配置ssl ,本来是可行的,可惜我太菜.. 没成功。

这里贴一个简单点的。

nginx 配置https ,tomcat 使用http

首先,需要有ssl证书,然后配置nginx为ssl ,修改下tomcat的server.xml 配置。

nginx 配置

这部分基本不变,还是原来的配置。

server {
        listen 443;
        ssl on;
        server_name  此处为域名;

        ssl_certificate cert/此处为申请的证书.pem;
        ssl_certificate_key cert/此处为申请的证书.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
        ssl_prefer_server_ciphers on;
# 这里可以将http重定向到https 
    error_page 497 301 https://$http_host$request_uri;
        location / {
           # 这里还是使用http ,映射本地的tomcat端口 
            proxy_pass   http://localhost:8101;
            client_max_body_size    1000m; 
            proxy_redirect    off;
            proxy_set_header Host $host:$server_port;
            # 这里要注意,增加这一行
            proxy_set_header X-Forwarded-Proto https;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header User-Agent $http_user_agent;
            proxy_set_header header_userid $http_header_userid;
            proxy_set_header user_type $http_user_type;
            #防止网页被Frame
            add_header X-Frame-Options SAMEORIGIN;
        }
}

tomcat 配置需要修改的地方

<Connector port="8101" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" proxyPort="443" URIEncoding="UTF-8" />

修改redirectPort 为 443 ,增加 proxyPort="443"。如果非443,则变更为其他端口。

然后在 Engine 下增加:

<Valve className="org.apache.catalina.valves.RemoteIpValve"  
                  remoteIpHeader="x-forwarded-for"  
                   remoteIpProxiesHeader="x-forwarded-by"  
                   protocolHeader="x-forwarded-proto" />

增加 Value


这样就可以了,主要是tomcat的配置,需要修改redirectPort proxyPort 以及增加valueprotocolHeader="x-forwarded-proto" ,再就是nginx 增加一个 proxy_set_header X-Forwarded-Proto https .

OK 了,做个记录,下次忘了再来查。

转载请注明出处: https://chrunlee.cn/article/nginx-tomcat-ssl.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
关于即时通讯,现在各路APP基本都有,虽然不能说是核心,但是如果没有又总会觉的少点啥。 如果对即时通讯要求不高,且用户量不大,只是想要从无到有的话,可以直接使用现有的服务即可,有不少免费的足够支持小量用户的要求。但是如果用户量稍微较大,且需要一些定制服务又不想受制于人,那么搭建自己的即时通讯服务器可能是你最终的选择。但是,从头开发肯定是不可能的。
nginx 监听的服务器的9000 端口,转的443 到tomcat 中,但是在java web jsp中获取的端口却还是443.
项目为长期稳定运行中,由于新增功能或修复BUG,修改代码后无法启动。根据添加的代码删减,最后确认出的问题。
记录下关于通过tomcat来配置https ,使java web项目可以直接通过https来访问,之前的时候都是走nginx来配置https,由于特殊原因443端口不能开启(具体是啥不清楚,运维不让开),只能如此配置下。
使用spring boot 来传递日期参数的时候,发现报错。顺手记录。
实际上,之前有对接过的... 但是忘记了,而且也没做详细记录,同时语言又换了.. 成java了,所有这里记录下,包括从微信的授权、token、以及到js-sdk 开发为止。
之前没接触过tigase,最近开始准备用这个来做IM ,开始预研..不过中间比较坎坷,虽然有忙别的事情,但是前前后后还是花了好几天的时间,资源太少,官网又看不懂,git还下不下来... 啥机制也不懂.. 真惆怅。
这只能算是一个小实现吧 ,也不算什么难点,就是加强下记忆,后续查找方便点而已,当然也有可能给你提供个小灵感啥的,那就再好不过了。