Nginx配置HTTPS跳转到非443端口的技巧和注意事项

这篇具有很好参考价值的文章主要介绍了Nginx配置HTTPS跳转到非443端口的技巧和注意事项。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言



近一段时间由于看到v*云服务厂商有活动,就注册并开了台云服务器,试一下区别。
(“充10美元送30天内有效的250美元的免费额度,意思是30天内在 你加起来 不超出250美元的 服务随便开,但是注意的是30天后这就不免费了,记得及时关闭。只支持paypal,而阿里alipay一般是充值没活动的”)

于是开始各种尝试,偶尔一次搭建服务下载镜像等文件,由于443端口并发较高,流量大,下载时间长,导致xx把443端口给封闭了,其他国外地区访问正常。(后来前面加个免费的cxxx cdn就可以解决)

正好总结一下http跳转https的各种方式,实际上是一种重复造轮子的文章,但是最起码证明到现在这个时间点它仍是这样配置



Nginx http跳转https(443端口)



方法一

rewrite强制将http的URL重写成https


server {
    listen 80;
    server_name  aaa.bbb.com ccc.bbb.com;
    rewrite ^(.*) https://$server_name$1 permanent;
}


server {
    listen 443 ssl;
    server_name  aaa.bbb.com ccc.bbb.com;
    charset utf-8;

    ssl_certificate /etc/letsencrypt/live/bbb.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/bbb.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;      # TLSv1.3需要nginx 1.13.0以上版本
    # 如果nginx版本低,建议使用这种加密算法配置
    # ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_ecdh_curve secp384r1;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets off;
    keepalive_timeout 70;

    #日志
    access_log  /var/log/nginx/bbb.access.log;
    error_log /var/log/nginx/bbb.error.log;
    
    #跨域
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
    add_header Access-Control-Allow-Headers Content-Type,Authorization;

    #白名单
    allow xx.xx.0.0/16;
    allow xx.xx.0.0/16;
    deny all; 

    root /usr/share/nginx/bbb;
    location / {
      proxy_redirect off;                   #隐藏nginx版本
      proxy_http_version 1.1;
      index  index.html;

    #.....其他
    }
}


方式二

return把http的域名请求转成https

server {
    listen 80;
    server_name aaa.bbb.com ccc.bbb.com;
    
    #schema判断是https的就按照下面的方式跳转
    if ($scheme = http){
	return 301 https://$server_name$request_uri;
         }
}

#or
#server {
#    listen 80;
#    server_name aaa.bbb.com ccc.bbb.com;
#	 return 301 https://$server_name$request_uri;     
#}

server {
    listen 443 ssl;
    server_name  aaa.bbb.com ccc.bbb.com;
    charset utf-8;

    ssl_certificate /etc/letsencrypt/live/bbb.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/bbb.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;      # TLSv1.3需要nginx 1.13.0以上版本
    # 如果nginx版本低,建议使用这种加密算法配置
    # ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_ecdh_curve secp384r1;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets off;
    keepalive_timeout 70;

    #日志
    access_log  /var/log/nginx/bbb.access.log;
    error_log /var/log/nginx/bbb.error.log;
    
    #跨域
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
    add_header Access-Control-Allow-Headers Content-Type,Authorization;

    #白名单
    allow xx.xx.0.0/16;
    allow xx.xx.0.0/16;
    deny all; 

    root /usr/share/nginx/bbb;
    location / {
      proxy_redirect off;                   #隐藏nginx版本
      proxy_http_version 1.1;
      index  index.html;

    #.....其他
    }
}


方式三

error_page 497 重新定义端口和链接

当nginx 配置的站点只允许https访问时,我们使用http去访问,就会报出497错误码
我们就可以利用error_page将497状态码的链接重定向到 https
这个也可以用来将http跳转到非443的ssl端口

例如:
error_page 497 https://$host:8443$request_uri;
其他配置:       
error_page 497 https://$host:$server_port$request_uri;  重定向到其他端口
error_page 497 https://$host$request_uri;                默认用302,临时重定向
error_page 497 =301 https://$host$request_uri;      永久重定向
error_page 497 =307 https://$host$request_uri;       临时重定向,不改变请求的方法(如post还是post)
server {
    listen 80;
    server_name aaa.bbb.com ccc.bbb.com;
    error_page 497  https://$host$uri?$args;
#    error_page 497  https://$host:$server_port$request_uri;
}


server {
    listen 443 ssl;
    server_name  aaa.bbb.com ccc.bbb.com;
    charset utf-8;

    ssl_certificate /etc/letsencrypt/live/bbb.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/bbb.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;      # TLSv1.3需要nginx 1.13.0以上版本
    # 如果nginx版本低,建议使用这种加密算法配置
    # ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_ecdh_curve secp384r1;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets off;
    keepalive_timeout 70;

    #日志
    access_log  /var/log/nginx/bbb.access.log;
    error_log /var/log/nginx/bbb.error.log;
    
    #跨域
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
    add_header Access-Control-Allow-Headers Content-Type,Authorization;

    #白名单
    allow xx.xx.0.0/16;
    allow xx.xx.0.0/16;
    deny all; 

    root /usr/share/nginx/bbb;
    location / {
      proxy_redirect off;                   #隐藏nginx版本
      proxy_http_version 1.1;
      index  index.html;

    #.....其他
    }
}


Nginx http跳转https(非443端口)



方式一

return 加  proxy_set_header Host $host:$server_port

$host参数不包含端口号,如果请求头部有端口就会丢失,从而使后端程序不能正确的获取端口号



server {
    listen 80;
    server_name aaa.bbb.com ccc.bbb.com;
    
    #schema判断是https的就按照下面的方式跳转
    if ($scheme = http){
	return 301 https://$server_name:8443$request_uri;
         }
}



server {
    listen 8443 ssl;
    server_name  aaa.bbb.com ccc.bbb.com;
    charset utf-8;

    ssl_certificate /etc/letsencrypt/live/bbb.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/bbb.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;      # TLSv1.3需要nginx 1.13.0以上版本
    # 如果nginx版本低,建议使用这种加密算法配置
    # ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_ecdh_curve secp384r1;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets off;
    keepalive_timeout 70;

    #日志
    access_log  /var/log/nginx/bbb.access.log;
    error_log /var/log/nginx/bbb.error.log;
    
    #跨域
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
    add_header Access-Control-Allow-Headers Content-Type,Authorization;

    #白名单
    allow xx.xx.0.0/16;
    allow xx.xx.0.0/16;
    deny all; 

    root /usr/share/nginx/bbb;
    location / {
      index  index.html;
      proxy_redirect off;                   #隐藏nginx版本
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host:$server_port;
   
     location /live { 
      proxy_redirect off;
      proxy_pass http://127.0.0.1:8081;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


    }


    #.....其他
    }
}


方式二

error_page 497 重新定义端口和链接

server {
    listen 80;
    server_name aaa.bbb.com ccc.bbb.com;
    error_page 497 https://$host:8443$request_uri;
}


server {
    listen 8443 ssl;
    server_name  aaa.bbb.com ccc.bbb.com;
    charset utf-8;

    ssl_certificate /etc/letsencrypt/live/bbb.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/bbb.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;      # TLSv1.3需要nginx 1.13.0以上版本
    # 如果nginx版本低,建议使用这种加密算法配置
    # ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_ecdh_curve secp384r1;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets off;
    keepalive_timeout 70;

    #日志
    access_log  /var/log/nginx/bbb.access.log;
    error_log /var/log/nginx/bbb.error.log;
    
    #跨域
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
    add_header Access-Control-Allow-Headers Content-Type,Authorization;

    #白名单
    allow xx.xx.0.0/16;
    allow xx.xx.0.0/16;
    deny all; 

    root /usr/share/nginx/bbb;
    location / {
      proxy_redirect off;                   #隐藏nginx版本
      proxy_http_version 1.1;
      index  index.html;

    #.....其他
    }
}


Nginx http,https多端口共存



这个需求常见于老服务,比如一个老项目以前是http的,后来又开发新的项目的访问域名还是这个,不过新地址需要改成https,比如加了个项目/live,这要求访问bbb.com/live是https
并且要不影响其他用户用http访问bbb.com/one,还有不清楚另外配置的那个https的项目是否有问题,这时候就可能需要2个访问方式都要暂时存在,之后看情况再看是否配置跳转

简单的来说就是,
只需要把listen 80; listen 443 ssl; 及其他要开启的端口一起放在同一个server里就可以



server {
    listen 80;
    listen 443 ssl;
    listen 8443 ssl;
    server_name   aaa.bbb.com ccc.bbb.com;
    charset utf-8;
    ......
}


补充



一台服务器上能部署多个nginx服务吗?



原则上来说是可以的,nginx安装到不同的位置,并且nginx的配置文件的端口不冲突即可
但不建议这样做,一般是人们是通过server添加多个虚拟主机,而不是启动多个nginx
即使是搞高可用也是一台服务器一个nginx,一台服务器上搞什么高可用,如果那台服务器宕机web全挂了



这个问题实际上是4-5年前舍友去某相亲网站工作时,他们的开发给他提的奇怪的需求,刚好想起来就吐槽一下



吐槽?:
本来一直懒得写很基础的文章,基本都在写解决某些问题类型的文章。但是看到某些书籍上也不过是基础知识的集合加少量论文上贴过来原理性质的东西。于是干脆还是随便写,没有走什么高大上的路线或者什么专一的路线,只是写想写的,直接的把某些问题解决,等写多了整理一些系列
百分百原创的原理或理论层次的文章,很高大,但是整理语言是很费心力的,所以经常有的人直接把教材或者国外文档,直接分片贴过来,连句自己的话都没有的,标原创就很无语。通常说教材不讲人话,但是教别人或做教程,照本宣科的,有书即可要你何用文章来源地址https://www.toymoban.com/news/detail-417378.html

到了这里,关于Nginx配置HTTPS跳转到非443端口的技巧和注意事项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Nginx如何实现http自动跳转到https

    本文主要介绍了Nginx实现http自动跳转到https,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着微点阅读小编来一起学习学习吧 https是更安全的http,通过http自动跳转https,可以更便于用户使用web。 有几下几个方法可以

    2024年02月11日
    浏览(35)
  • linux配置https访问使用443端口方法

    在Linux上,使用普通用户启动Nginx并监听443端口可能会失败。这是因为端口号低于1024的端口是受保护的特权端口,只有具有管理员权限的用户才能使用这些端口。 使用高于1024的端口:将Nginx配置文件中的端口号修改为高于1024的端口(例如8443),然后使用普通用户启动Nginx。这

    2024年02月09日
    浏览(35)
  • 解决nginx已配置但访问依旧跳转到nginx的欢迎页面

    1、确定nginx.conf配置没有问题 2、确保修改了nginx.conf文件后重启了nginx,nginx -s reload 3、查看是否有两个nginx在运行,如果有两个nginx运行,则停止nginx再重新启动         查看nginx运行:ps -ef | grep nginx         停止nginx:nginx -s stop         启动nginx:nginx 重新访问页面,

    2024年02月02日
    浏览(32)
  • docker中使用nginx配置ssl证书,443端口无法连接

    环境:docker + 云服务器+域名 准备:下载ssl证书文件,安全组开放443端口, nginx容器映射443端口 (切记!!!我就是这里忘记配置, 结果弄了好久); 如果上面操作都做好了,在nginx也配置了,但是还是有问题,那么就是你的nginx没有映射443端口,博主这里就是踩了这个坑,话不多说

    2024年02月07日
    浏览(38)
  • Nginx配置网络分流,监听80和443端口(Ubuntu22.04)

    启动 重载配置 查看状态 文件目录 /etc/nginx/nginx.conf 80端口尚未添加http2参数 使用http://的格式,如果使用了CF的CDN加速,则将域名对应的SSL/TLS边缘证书选项的始终使用HTTPS关闭 SSL/TLS 加密模式随意 使用https://的格式,如果使用了CF的CDN加速,则将域名对应的SSL/TLS边缘证书选项的

    2024年01月19日
    浏览(26)
  • docker中使用nginx配置腾讯云ssl证书,443端口无法连接

    环境:docker + 腾讯云轻量应用服务器+腾讯云域名 准备:首先需要去腾讯云域名下载ssl证书文件,创建安全组开放443端口,服务器防火墙开放443端口; 如果上面操作都做好了,在nginx也配置了,但是还是有问题,那么就是你的nginx没有映射443端口,博主这里就是踩了这个坑,话

    2024年02月11日
    浏览(45)
  • SpringBoot Tomcat 配置https 且443端口也是https(若依为例对接微信小程序的https,小程序也可以访问)

    1   服务器去下载免费的证书(选在tomcat jks版本的)  2   将下载的证书移动到resources目录下  3 改写yml配置文件  9898 为https 对应的端口 key-store中注释的为你的域名 key-password为刚刚下载的第二个txt文件中的内容 key-store-password和key-password是一样的 key-alias 为你自己的域名  4

    2024年02月13日
    浏览(30)
  • Nginx配置http跳转https

    Nginx 可通过多种方式实现 http 跳转 https,以下列出各种方式的实现方法。 这是 Nginx 新版本的写法,推荐使用。在 Nginx 80 监听服务上加一行: 完整配置如下: Nginx 老版本的写法,不推荐使用。将 “#http跳转https” 这行修改为: 或 将 “#http跳转https” 这行修改为: 写一个

    2024年02月13日
    浏览(38)
  • 使用nginx-lua配置统一url自动跳转到hadoop-ha集群的active节点

    下载安装nginx所用的依赖 下载nginx 稍后安装nginx 安装lua语言 安装LuaJIT,安装路径/opt/luaJIT-2.1.0自行设置 设置环境变量 打开: vi /etc/profile 保存: . /etc/profile 下载ngx_devel_kit(NDK)模块 :https://github.com/simpl/ngx_devel_kit/tags,不需要安装,记住存放位置/opt/luaJIT-2.0.5/package/ngx_deve

    2024年02月10日
    浏览(42)
  • nginx配置http强制跳转https

    一、什么是Nginx? Nginx是一个高性能的HTTP和反向代理Web服务器,同时也提供IMAP/POP3/SMTP服务。Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3/SMTP)代理服务器。Nginx的特点是:占有内存少,并发能力强。 Nginx专门为性能优化而开发,性能是最重要的考量,非常

    2024年02月16日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包