Nginx+Springboot配置https后的scheme和port问题

这篇具有很好参考价值的文章主要介绍了Nginx+Springboot配置https后的scheme和port问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.环境

反向代理:Nginx (nginx version: nginx/1.14.2)

网关:Zuul (2.2.9.RELEASE)

服务:SpringBoot使用内置Tomcat (9.0.71)

2.相关配置

Nginx:设置请求头,向后面的代理或服务传递真实的协议、域名(ip)、端口

 proxy_set_header Host $host:$server_port;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "upgrade";
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-Proto $scheme;
 proxy_set_header X-Forwarded-Scheme $scheme;
 proxy_set_header X-Forwarded-Port $server_port;
 proxy_redirect http://  $scheme://;

Zuul

server.tomcat.remoteip.remote-ip-header=X-Forwarded-For
server.tomcat.remoteip.protocol-header=X-Forwarded-Proto
server.tomcat.remote.port-header=X-Forwarded-Port
server.forward-headers-strategy=native
zuul.add-host-header=true
zuul.add-proxy-headers=false

SpringBoot

server.tomcat.remoteip.remote-ip-header=X-Forwarded-For
server.tomcat.remoteip.protocol-header=X-Forwarded-Proto
server.tomcat.remote.port-header=X-Forwarded-Port
server.forward-headers-strategy=native
server.tomcat.remoteip.internal-proxies=192\.168\.16\.50|10\.\d{1,3}\.\d{1,3}\.\d{1,3}|169\.254\.\d{1,3}\.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3}|172\.1[6-9]{1}\.\d{1,3}\.\d{1,3}|172\.2[0-9]{1}\.\d{1,3}\.\d{1,3}|172\.3[0-1]{1}\.\d{1,3}\.\d{1,3}|0:0:0:0:0:0:0:1|::1

3.常见问题

3.1.request.getScheme()获取的是http

1.确认Nginx配置:proxy_set_header X-Forwarded-Proto $scheme;

2.确认SpringBoot配置:server.tomcat.remoteip.protocol-header=X-Forwarded-Proto

3.上面都配置,还不行;去看看代码哪里设置的这个请求头(X-Forwarded-Proto)

类:org/apache/catalina/valves/RemoteIpValve.java
方法:public void invoke(Request request, Response response) 
 
if (protocolHeader != null) {
	String protocolHeaderValue = request.getHeader(protocolHeader);
	if (protocolHeaderValue == null) {
		// Don't modify the secure, scheme and serverPort attributes
		// of the request
	} else if (isForwardedProtoHeaderValueSecure(protocolHeaderValue)) {
		request.setSecure(true);
		request.getCoyoteRequest().scheme().setString("https");
		setPorts(request, httpsServerPort);
	} else {
		request.setSecure(false);
		request.getCoyoteRequest().scheme().setString("http");
		setPorts(request, httpServerPort);
	}
}

前提条件:
final String originalRemoteAddr = request.getRemoteAddr();
boolean isInternal = internalProxies != null &&
		internalProxies.matcher(originalRemoteAddr).matches();

if (isInternal || (trustedProxies != null &&
		trustedProxies.matcher(originalRemoteAddr).matches())) {
		#满足条件
}

就是request.getRemoteAddr()要满足这个2个正则之一:internalProxies、trustedProxies
private Pattern internalProxies = Pattern.compile(
	"10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|" +
	"192\\.168\\.\\d{1,3}\\.\\d{1,3}|" +
	"169\\.254\\.\\d{1,3}\\.\\d{1,3}|" +
	"127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|" +
	"172\\.1[6-9]{1}\\.\\d{1,3}\\.\\d{1,3}|" +
	"172\\.2[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}|" +
	"172\\.3[0-1]{1}\\.\\d{1,3}\\.\\d{1,3}|" +
	"0:0:0:0:0:0:0:1|::1");
private Pattern trustedProxies = null;

trustedProxies没找到设置的地方,internalProxies是可以配置的
server.tomcat.remoteip.internal-proxies=xxxx

关键问题,为啥request.getRemoteAddr()没有匹配internalProxies;我内网测试一直没问题。
我在出问题的环境,用arthas拿一下request.getRemoteAddr()这个值:watch org.apache.catalina.connector.Request getRemoteAddr  "{params,returnObj}" -x 2 
结果拿出来,是这台机器的公网ip,不满足上面的正则;参考上面springboot把拿到的ip配置到server.tomcat.remoteip.internal-proxies就好了。



3.2.request.getServerPort()获取不到正确的端口

1.确认Nginx配置:proxy_set_header X-Forwarded-Port $server_port;

2.确认SpringBoot配置:server.tomcat.remoteip.protocol-header=X-Forwarded-Port

3.使用的是其他端口,但是取到的是443

nginx scheme,nginx,https,运维,spring boot文章来源地址https://www.toymoban.com/news/detail-803556.html

现象:
request.getServerPort()得到443
request.getHeader("X-Forwarded-Port")得到:9999,9999

方案1:将Nginx和springboot配置和获取的请求头调整为X-Forwarded-tPort
方案2(推荐):Zuul配置:zuul.add-proxy-headers=false

到了这里,关于Nginx+Springboot配置https后的scheme和port问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Minio nginx配置https和http问题解决,疑难症全网首发

    进入下面小程序可以体验效果 :   以下问题基本上是因为NGINX代理出现 一、API直接返回单独的错误: io.minio.errors.ErrorResponseException: Access denied 二、API直接返回的错误:The request signature we calculated does not match the si 三、预览文件或者图片返回错误 以上三个问题都属于Access den

    2024年02月13日
    浏览(50)
  • nginx处理cros跨域遇到的各种问题及解决方案,以及https配置和浏览器https不安全问题处理

    提示:本人在生产部署服务时遇到一系列跨域问题和https配置问题,特此做以下记录: 跨域是指a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,或是a页面为ip地址,b页面为域名地址,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了

    2024年02月02日
    浏览(62)
  • SpringBoot + Vue2项目打包部署到服务器后,使用Nginx配置SSL证书,配置访问HTTP协议转HTTPS协议

    配置nginx.conf文件,这个文件一般在/etc/nginx/...中,由于每个人的体质不一样,也有可能在别的路径里,自己找找... 证书存放位置,可自定义存放位置 两个文件 后端配置 把.pfx拷贝到resource下,然后配置一下yml

    2024年02月02日
    浏览(70)
  • liunx nginx配置ssl 配置https 及访问失败问题排查(fopen:No such file or )([emerg] the “ssl“ parameter requires)

    1.ssl证书下载 比如腾讯云下载目录: 首先在网址(阿里云、腾讯云等)找到域名ssl下载,下载后解压里面有xxx.yey、xxx.pem、xxx.crt等文件 在服务器nginx配置里新建个文件夹,如我的nginx 在 /usr/local/nginx这个目录 2.将ssl证书文件拷贝至服务器 如: 3.检查有没有ssl插件(nginx -V 中V大写

    2024年02月13日
    浏览(45)
  • 【Nginx】使用自生成证书配置nginx代理https

    使用Nginx代理HTTPS请求并使用自签名证书,可以按照以下步骤进行配置: 生成自签名证书: 打开终端或命令提示符,并导航到Nginx配置文件所在的目录。 运行以下命令生成自签名证书和私钥: openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ssl.key -out ssl.crt 根据提示输入证书的相

    2024年01月18日
    浏览(62)
  • Linux下Nginx配置SSL模块,Nginx安装SSL,Nginx支持https配置详细教程

    前提:Linux安装Nginx,参考教程:CentOS7安装Nginx完整教程,Linux系统下保姆式安装Nginx教程 | 老麻 安装好Nginx之后,需要支持SSL时,要单独安装SSL模块,方法如下: 输入 ./nginx –V 命令,注意V是大写,查看配置是否包含“–with-http_ssl_module”,包含则表示已配置好SSL,如果不包

    2024年02月08日
    浏览(51)
  • nginx配置https证书

    甲方发来的nginx证书解压后有一个 key类型及pem类型的文件 修改的代码就圈中的几句, ssl_protocols SSLv3 TLSv1; # SSL协议 这个注释掉了,否则谷歌高版本浏览器 可能提示 ERR_SSL_VERSION_OR_CIPHER_MISMATCH 报错信息

    2024年02月08日
    浏览(37)
  • nginx配置https访问

    为什么需要使用HTTPS,因为HTTP不安全,当使用http进行消息传输时,可能会遭到黑客的劫持和篡改,如果采用https协议,那么数据在传输过程中是加密的,所以黑客无法窃取或者篡改数据报文信息,同时也避免网站传输时信息泄露。 实现https:需要使用ssl协议。 首先需要申请证

    2024年01月22日
    浏览(38)
  • Nginx【https配置】

    为什么要使用https 1、因为http采用的时明文传输,敏感数据(账号、密码、交易信息)不安全。容易遭到篡改 2、https采用的是超文本传输协议,数据在传输时会加密,能够避免信息泄露 TLS和SSL是如何将数据加密的(他们运行在应用层和传输层之间) 1、提供数据安全(不被泄

    2024年02月11日
    浏览(40)
  • Nginx配置https及证书

    之前我们使用的是自签名的SSL证书,对于浏览器来说是无效的。使用权威机构颁发的SSL证书浏览器才会认为是有效的,这里给大家推荐两种申请免费SSL证书的方法,一种是从阿里云申请,https://common-buy.aliyun.com/?spm=5176.2020520163.0.0.e8f856a74ReRXhcommodityCode=cas 链接地址 另一种是从

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包