Nginx 配置 http 强制跳转到 https

 

个人真实配置

      架构:Nginx 反向代理 + Nginx 前端(LNMP)

      在 Nginx 反向代理的 虚拟机主机配置文件中,作如下配置:

upstream ilexa_cn {
     server 192.168.1.100:80;
     keepalive 50;
}


server {
   listen 80;
   server_name ilexa.cn;
   return 301 https://$server_name$request_uri;
}


server {
    listen 443 ssl;
    server_name ilexa.cn;
    access_log  logs/ilexa_cn.log  main;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_set_header  Connection "keep-alive";
    ssl on;
    ssl_session_timeout  5m;

    ssl_certificate      /etc/nginx/pki/ilexa_cn_bundle.crt;
    ssl_certificate_key  /etc/nginx/pki/ilexa_cn.key;

    location / {
        proxy_pass http://ilexa_cn;
        proxy_set_header Host $host;
        # needed for HTTPS
        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;
    }

    error_page 497 https://$host$uri?$args;
}

 

 

【网络资料】Nginx 配置 http 强制跳转到 https 

 Nginx 的 return 301 跳转

      项目的虚拟主机配置文件:

#先监听80端口,为http请求,然后强制转发到https监听的443端口上面
server {
   listen       80;
   root         /var/www/html/ilexa/;
   server_name  ilexa.cn;
   return  301  https://$server_name$request_uri;
}

#监听443端口,https请求
server {
   listen        443 ssl;
   root          /var/www/html/ilexa/;
   index         index.php index.html index.htm;
   server_name   ilexa.cn;

   ssl  on;
   ssl_certificate        /etc/nginx/pki/ilexa_cn_bundle.crt;
   ssl_certificate_key    /etc/nginx/pki/ilexa_cn.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;
  
   location ~ \.php$ {
      fastcgi_pass   127.0.0.1:9000;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
fastcgi_param HTTPS $https if_not_empty; # 网上资料有的这行也不增加 include fastcgi_params; } }

 

 

 

Nginx 的 Rewrite 方法

       将所有的 http 请求通过 rewrite 重写到 https 上即可

 

Nginx前端的配置:

#先监听80端口,为http请求,然后强制转发到https监听的443端口上面
server {
   listen       80;
   root         /var/www/html/ilexa/;
   server_name  ilexa.cn;
   rewrite ^(.*) https://$server_name$1 permanent;
}

#监听443端口,https请求
server {
   listen                 443 ssl;
   root                   /var/www/html/ilexa/;
   server_name            ilexa.cn;
   ssl_certificate        /etc/nginx/pki/ilexa_cn_bundle.crt;
   ssl_certificate_key    /etc/nginx/pki/ilexa_cn.key;
  
   location ~ \.php$ {
      fastcgi_pass   127.0.0.1:9000;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
      include        fastcgi_params;
   }
}

 

      搭建此虚拟主机完成后,就可以将 http://ilexa.cn 的请求全部重写到 https://ilexa.cn 上了

 

 

Nginx 的 497 状态码

497 - normal request was sent to HTTPS  

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

 

思路:

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

 

配置:

server {  
    listen 192.168.1.100:443;  #ssl端口  
    listen 192.168.1.100:80;   #用户习惯用http访问,加上80,后面通过497状态码让它自动跳到443端口  
    server_name  ilexa.cn;  
    
    ssl  on;        #为一个server{......}开启ssl支持  
     
    ssl_certificate      /etc/nginx/ilexa_cn.crt;   #指定crt格式的证书文件   
    ssl_certificate_key  /etc/nginx/ilexa_cn.key;   #指定crt格式的私钥文件
      
    #让http请求重定向到https请求   
    error_page 497  https://$host$uri?$args;  
} 

 

 

利用 meta 的刷新作用(index.html首页跳转)

       以上两种方法均会耗费服务器的资源,我们用 curl 访问baidu.com试一下,看百度的公司是如何实现 baidu.com 向 www.baidu.com 的跳转

       可以看到百度很巧妙的利用 meta 的刷新作用,将 baidu.com跳转到www.baidu.com.因此我们可以基于 http://ilexa.cn 的虚拟主机路径下也写一个index.html,内容就是http向https的跳转

 

index.html 文件内容:

<html>  
    <meta http-equiv="refresh" content="0;url=https://ilexa.cn/">  
</html>  

 

nginx 虚拟主机配置:

server {  
    listen 192.168.1.100:80;  
    server_name ilexa.cn;  
      
    location / {  
        root /srv/www/ilexa/;     #index.html放在虚拟主机监听的根目录下  
    }  

    error_page  404 https://ilexa.cn/;   #将404的页面重定向到https的首页  
}  

 

 

Aapache 下 http 强制跳转到 https 的配置

       根目录建立 .htaccess 文件。内容如下

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*) https://%{SERVER_NAME}/$1 [R,L]

       当用户在浏览器直接输入域名 ilexa.cn 的时候,这时候域名直接会转向https://ilexa.cn,而且服务器这样配置的效率也蛮高的。

 

posted on 2020-05-27 16:37  morgan363  阅读(1844)  评论(0编辑  收藏  举报

导航