Nginx使用重写301规则将HTTP重定向到HTTPS

时间:2020-01-09 10:42:18  来源:igfitidea点击:

问题:
我已将nginx设置为安全的反向代理服务器。
如何在nginx Web服务器下将所有http://example.com/请求(流量)重定向到https://example.com/?
如何配置Nginx将HTTP重定向到HTTPS?

答:
您可以使用Nginx Web服务器轻松地将所有http请求重写/重定向到https。
语法如下。
您需要在位置或者服务器指令中添加以下内容。
本教程介绍了如何在Nginx中将HTTP通信重定向到HTTPS。

Nginx重定向HTTP到HTTPS

现在,您已经为Nginx配置并安装了SSL证书,是时候丢弃所有HTTP通信并将用户发送到HTTPS版本了。
编辑nginx.conf文件:

sudo vi /etc/nginx/nginx.conf
if ($host ~* ^(example\.com|www\.example\.com)$ ){
  rewrite  ^/(.*)$  https://example.com/  permanent;
}

或者最好使用以下重写:

rewrite  ^ https://$server_name$request_uri? permanent;

或者使用新语法(推荐):

return         301 https://$server_name$request_uri;

使用Nginx服务器将所有HTTP请求重定向到HTTPS

编辑您的nginx.conf文件,执行:

# vi nginx.conf

您需要按以下方式定义http和https服务器:

################################
## our HTTP server at port 80 ##
################################
server {
      listen      80 default;
      ## set up domain name here ##
      server_name www.theitroad.local theitroad.local
      access_log off;
      error_log off;
      ##** nginx redirect ALL http requests to https ** ##
      return      301 https://$server_name$request_uri;
}
#########################################################################
## Our HTTPS server at port 443. You need to provide ssl config below ###
#########################################################################
server {
      access_log  logs/theitroad.local/ssl_access.log main;
      error_log   logs/theitroad.local/ssl_error.log;
      index       index.html;
      root        /usr/local/nginx/html;
      ## start ssl config ##
      listen      443 http2 ssl;
      server_name www.theitroad.local theitroad.local
 
     ## redirect www to nowww
      if ($host = 'www.theitroad.local' ) {
         rewrite  ^/(.*)$  https://theitroad.local/  permanent;
      }
 
    ### ssl config - customize as per your setup ###
     ssl_certificate      ssl/theitroad.local/theitroad.local_combined.crt;
     ssl_certificate_key  ssl/theitroad.local/theitroad.local.key_without_password;
     ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;
     keepalive_timeout    70;
     ssl_session_cache    shared:SSL:10m;
     ssl_session_timeout  10m;
    ### Rest of my config. It is optional. Do it only if you have Apache on backend ## 
 
    ## PROXY backend 
      location / {
        add_header           Front-End-Https    on;
        add_header  Cache-Control "public, must-revalidate";
        add_header Strict-Transport-Security "max-age=2592000; includeSubdomains";
        proxy_pass  http://theitroadproxy;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      }
}

保存并关闭文件。
重新加载或者重启nginx服务器:

# nginx -s reload

测试一下:

$ curl -I http://theitroad.local
$ curl -I http://theitroad.local/foo/bar/file.html

输出示例:
在Nginx服务器中将301 HTTP重写为HTTPS

重定向所有HTTP流量

在您的nginx.conf中编辑或者添加如下内容:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 301 https://$host$request_uri;
}

return指令停止处理并将指定的代码返回给客户端。
非标准代码444关闭连接而不发送响应头。
在上面的示例中,我们返回HTTP代码301:

return code URL;
return 301 URL;
return 301 URL;

可以使用以下代码:

  • HTTP/301 HTTP响应状态代码301"已永久移动"用于永久URL重定向
  • HTTP/302找到的HTTP响应状态代码302是执行带有"临时移动"代码的URL重定向的常用方法。

另外,可以使用代码302将用于临时重定向的URL指定为唯一参数。
这样的参数应以http://,https://或者$scheme字符串开头。