Nginx http强转https

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx http强转https相关的知识,希望对你有一定的参考价值。

参考技术A

参考大神文章 散尽浮华

http访问强制跳转到https
网站添加了https证书后,当http方式访问网站时就会报404错误,所以需要做http到https的强制跳转设置.

一、采用nginx的rewrite方法

例如将所有的dev.demodomain.com域名的http访问强制跳转到https。

下面配置均可以实现:

配置1:

配置2:

配置3:这种方式适用于多域名的时候,即访问 demodomain.com 的http也会强制跳转到 https://dev.demodomain.com 上面

配置4:下面是最简单的一种配置

497 - normal request was sent to HTTPS

解释:当网站只允许https访问时,当用http访问时nginx会报出497错误码

思路:

利用error_page命令将497状态码的链接重定向到 https://dev.demodomain.com 这个域名上

配置实例:

如下访问dev.demodomain.com或者demodomain.com的http都会被强制跳转到https

也可以将80和443的配置放在一起:


到443端口

server_name dev.demodomain.com;

如果遇到非标准443端口的https情况下,则http到https的强转配置就需要使用上面这种497状态码的方式了。如下:

这样访问 http://www.kevin.com:9443 就会自动跳转到 https://www.kevin.com:9443 。

这种方式直接配置https端口就可以,不需要再配置http端口。

|

上述的方法均会耗费服务器的资源,可以借鉴百度使用的方法:巧妙的利用meta的刷新作用,将http跳转到https

可以基于 http://dev.demodomain.com 的虚拟主机路径下写一个index.html,内容就是http向https的跳转

将下面的内容追加到index.html首页文件内

[root@localhost ~]# cat /usr/local/nginx/conf/vhosts/test.conf

这里分享一个nginx反代tomcat,并且http强制跳转至https的配置示例 (这里访问 http://zrx.demodomain.com 和访问 http://172.29.34.33:8080/zrx/ 结果是一样的)

[root@BJLX_34_33_V vhosts]# cat zrx.conf

解决办法:

nginx https配置多域名共享SSL证书禁止ip访问http强转https

nginx https配置

server 
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     www.example.com.crt;
    ssl_certificate_key www.example.com.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    ...

按照nginx官方文档所说,要支持https,只需要配置listenssl_certificatessl_certificate_key 三项,ssl_certificate是公钥,通常称为公钥证书,客户端请求建立连接时服务端会将公钥发送给客户端,ssl_certificate_key 是私钥,需要保密,私钥存在服务器端,建立连接时,不会发送到客户端;ssl_protocolsssl_ciphers可以不指定,使用默认值即可。

nginx单ip多域名共享SSL证书

Https证书的SubjectAltName字段可以准确指定适配域名,比如a.domain.comb.domain.com,但有长度限制;SubjectAltName字段还可以指定通配符域名,比如*.domain.com,它只能覆盖一级,a.domain.com,b.doamin.com,但不能覆盖domain.com;通常可以将这两种使用方式结合起来,比如domain.com*.domain.com
单ip多域名情况,应该如何配置证书呢?
答案是在http块中配置SSL,这样server块会继承http中的ssl证书配置,SSL证书只占一块内存,与各个server中配置相比能节省内存。

http
    ssl_certificate     common.crt;
    ssl_certificate_key common.key;

    server 
        listen          443 ssl;
        server_name     www.example.com;
        ...
    

    server 
        listen          443 ssl;
        server_name     www.example.org;
        ...
    

查看证书内容

也许你会好奇,应该怎么查看SSL证书的域名信息呢?拿百度为例。
点击地址栏的锁---->连接是安全的---->证书有效---->详细信息---->使用者可选名称


可以看到,证书适配*.baidu.combaidu.com,还有个常见需求查看证书有效期

当然也可以通过命令查看证书内容,那就要用到openssl了,windows安装openssl,选择Win64 OpenSSL v3.0.3 Light版本,这也是官方推荐的版本。

查看证书内容
先将证书导出
点击地址栏的锁---->连接是安全的---->证书有效---->详细信息---->复制到文件----->

勾选base64编码

openssl x509 -in my.cer -noout -text

查看证书链

有时同一个https网站,有的浏览器正常,有的浏览器告警,这大概率是证书签发机构是中间商,不在浏览器的基础签发库里导致,可以将中间商一直到root的签发机构串起来,
cat www.example.com.crt bundle.crt > www.example.com.chained.crt,注意www.example.com.crt要在前边;
查看证书链命令:

openssl s_client -connect www.baidu.com:443

nginx http强转https

  server
    listen 80;
    return 301 https://$host$request_uri;
  
  • $host 依次从请求url中、request header的Host中、匹配的server_name中获取;
  • $request_uri会包含全部参数的原始请求uri

nginx 禁止ip访问

  server
     listen 80 ;
     listen 443 ssl;
     server_name 指定ip;
     return 403;
  

个人公众号

以上是关于Nginx http强转https的主要内容,如果未能解决你的问题,请参考以下文章

nginx https配置多域名共享SSL证书禁止ip访问http强转https

nginx https配置多域名共享SSL证书禁止ip访问http强转https

nginx https配置多域名共享SSL证书禁止ip访问http强转https

http强转https

http 转hhttps

List不能强转成Page