jjzjj

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

漠效 2024-03-13 原文

前言



近一段时间由于看到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年前舍友去某相亲网站工作时,他们的开发给他提的奇怪的需求,刚好想起来就吐槽一下



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

有关Nginx配置HTTPS跳转到非443端口的技巧和注意事项的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  3. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  4. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  6. 神州数码无线产品(AC+AP)配置 - 2

    注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配

  7. 阿里云国际版免费试用:如何注册以及注意事项 - 2

    作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。​关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐

  8. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  9. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  10. Ruby 默认将 IRB 配置为 Pretty_Inspect - 2

    我是ruby​​的新手,正在配置IRB。我喜欢pretty-print(需要'pp'),但总是输入pp来漂亮地打印它似乎很麻烦。我想做的是默认情况下让它漂亮地打印出来,所以如果我有一个var,比如说,'myvar',然后键入myvar,它会自动调用pretty_inspect而不是常规检查。我从哪里开始?理想情况下,我将能够向我的.irbrc文件添加一个自动调用的方法。有什么想法吗?谢谢! 最佳答案 irb中默认pretty-print对象正是hirb被迫去做。Theseposts解释hirb如何将几乎所有内容转换为ascii表。虽

随机推荐