nginx强制使用https访问(http跳转到https)

需求简介

基于nginx搭建了一个https访问的虚拟主机,监听的域名是test.com,但是很多用户不清楚https和http的区别,会很容易敲成http://test.com,这时会报出404错误,所以我需要做基于test.com域名的http向https的强制跳转

我总结了三种方式,跟大家共享一下

 

 

nginx的rewrite方法

 

思路

这应该是大家最容易想到的方法,将所有的http请求通过rewrite重写到https上即可

 

配置

 

  1. server {  
  2.     listen  192.168.1.111:80;  
  3.     server_name test.com;  
  4.       
  5.     rewrite ^(.*)$  https://$host$1 permanent;  
  6. }  


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

 

 

nginx的497状态码

 

error code 497

 

 

  1. 497 - normal request was sent to HTTPS  


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

 

思路

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

 

配置

 

 

  1. server {  
  2.     listen       192.168.1.11:443;  #ssl端口  
  3.     listen       192.168.1.11:80;   #用户习惯用http访问,加上80,后面通过497状态码让它自动跳到443端口  
  4.     server_name  test.com;  
  5.     #为一个server{......}开启ssl支持  
  6.     ssl                  on;  
  7.     #指定PEM格式的证书文件   
  8.     ssl_certificate      /etc/nginx/test.pem;   
  9.     #指定PEM格式的私钥文件  
  10.     ssl_certificate_key  /etc/nginx/test.key;  
  11.       
  12.     #让http请求重定向到https请求   
  13.     error_page 497  https://$host$uri?$args;  
  14. }  

 

 

index.html刷新网页

 

思路

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

 

 

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

 

index.html

[html] view plaincopyprint?

 

  1.   
  2.   
  3.   

 

nginx虚拟主机配置

 

  1. server {  
  2.     listen 192.168.1.11:80;  
  3.     server_name test.com;  
  4.       
  5.     location / {  
  6.                 #index.html放在虚拟主机监听的根目录下  
  7.         root /srv/www/http.test.com/;  
  8.     }  
  9.         #将404的页面重定向到https的首页  
  10.     error_page  404 https://test.com/;  
  11. }  

 

 

 

 

物理机的访问的ip:221.221.1.100

对外开放的外网ip:200.200.19.53

nginx:10.30.30.109:8314

代理后台服务的ip:10.30.30.131:8080

server{
        listen 8314;
        server_name 200.200.19.53;
        #server_name 10.30.30.109;
        location /jettech {
                 proxy_pass http://10.30.30.131:8080;
                 proxy_pass_request_headers  off;
                 proxy_cache_valid  200 206 304 301 302 10d;
                 proxy_cache_key $uri;
                 proxy_ignore_headers Set-Cookie Cache-Control;
                 proxy_hide_header Cache-Control;
                 proxy_hide_header Set-Cookie;
                 proxy_set_header   proxy_nginx_ip   $host; #server_name of ip,200.200.19.53
                 proxy_set_header   X-Real-IP_Client_Access  $remote_addr; #access clint host or yourself of ip。用户访问的时候的自己电脑ip地址221.221.1.100
                 proxy_set_header   X-Real-Port_Client_Access  $remote_port; #access clint port。用户访问的时候的自己电脑端口,随机分配动态变化
                 proxy_set_header   X-Real-User_Client_Access  $remote_user ; #access clint user。客户的用户名
                 proxy_set_header   X-Referer $http_referer;
                 proxy_set_header   Cookie $http_cookie;
                 proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for; #all access client ip 。从客户访问到到最后的后台服务所经理的所有节点的ip汇总221.221.1.100,10.30.30.109,...
                 proxy_set_header   X-FORWARDED-HOST $server_addr; #nginx of ip 10.30.30.109
                 proxy_set_header   proxy_nginx_hostname  $hostname; # nginx of hostname,k8s-test-nginx-109
                 proxy_set_header   X-FORWARDED-PORT $server_port; #nginix of port or nginx listen of port,8314
                 proxy_set_header   X-FORWARDED-NAME $server_name; #serve_name of ip or $host
                 proxy_set_header   X-FORWARDED-PROTO $server_protocol;
                 proxy_set_header   X-NGINX_VER $nginx_version;
                 proxy_set_header   Proxy_Host $proxy_host; #proxy_pass of ip or houtai server of ip ,要转发的地址10.30.30.131(proxy_pass http://10.30.30.131:8080;)
                 proxy_set_header   Proxy_Port $proxy_port; #proxy_pass of port ou houtai server of port,要转发的端口8080(proxy_pass http://10.30.30.131:8080;)
                 proxy_http_version 1.1;
                 #开启对http1.1支持
                 proxy_set_header Connection "";
                 # 设置Connection为空串,以禁止传递头部到后端
                 # http1.0中默认值Connection: close
                 proxy_redirect                      off;
                 #proxy_pass http://10.30.30.131;
                }
        }
 

 

 

nginx 内置变量使用说明及具体意义

$args

参数: $args
解释: HTTP请求中的完整参数。
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "a=10"

    1
    2
    3
    4

$binary_remote_addr

参数: $binary_remote_addr
解释: 二进制格式的客户端地址。
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "\xC0\xA8\x01\xC8"

    1
    2
    3
    4

$body_bytes_sent

参数: $body_bytes_sent
解释: 表示在客户端发送的http响应中,包体部分的字节数
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "264"

    1
    2
    3
    4

$content_length

参数: $content_length
解释: 表示客户端请求头部中的Content-Length
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "264"

    1
    2
    3
    4

$content_type

参数: $content_type
解释: 表示客户端请求头部中的Content-Type
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "text/html"

    1
    2
    3
    4

$document_root

参数: $document_root
解释: 返回nginx服务器中资源跟目录,这取决于在server{}中定义的root路径
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "/usr/local/nginx/html"

    1
    2
    3
    4

$uri

参数: $uri
解释: 表示当前请求的URI,不带任何参数
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "/192.168.1.200"

    1
    2
    3
    4

$document_uri

参数: $document_uri
解释: 与$uri含义相同
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "/192.168.1.200"

    1
    2
    3
    4

$request_uri

参数: $request_uri
解释: 表示客户端发来的原始URL,带完整的参数,$request_uri永远不会变,始终是用户的原始URL
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "/192.168.1.200?a=10"

    1
    2
    3
    4

$host

参数: $host
解释: 表示客户端请求头部中的Host字段。如果Host字段不存在,则以实际处理的server name名称代替。如果Host字段中带有端口,如IP:PORT,那么$host会去掉端口
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "test.wanglei.com"

    1
    2
    3
    4

$hostname

参数: $hostname
解释: 表示Nginx所在的机器的名称,与gethostbyname调用返回的值相同
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "centos7-201"

    1
    2
    3
    4

$is_args

参数: $is_args
解释: 表示请求中的URL是否带参数,如果带参数,$is_args值为"?"。如果不带参数,则是空字符串
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "?"
访问: curl http://test.wanglei.com/192.168.1.200 -I
返回: ""

    1
    2
    3
    4
    5
    6

$limit_rate

参数: $limit_rate
解释: 表示当前限制速率是多少, 0表示无限速
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "51200"
配置: limit_rate 50k;

    1
    2
    3
    4
    5

$nginx_version

参数: $nginx_version
解释: 表示当前nginx的版本号
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "1.8.1"

    1
    2
    3
    4

$query_string

参数: $query_string
解释: 请求URI中的参数,与$args相同,然而$query_string是只读的不会变得
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "a=10"

    1
    2
    3
    4

$remote_addr

参数: $remote_addr
解释: 表示客户端的地址
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "192.168.1.200"

    1
    2
    3
    4

$remote_port

参数: $remote_port
解释: 表示客户端连接使用的端口,这个是随机的,每个人都不一样
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "50451"

    1
    2
    3
    4

$remote_user

参数: $remote_user
解释: 表示使用Auth Basic Module时定义的用户名
访问: curl -u wanglei:wanglei123 http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "wanglei"

    1
    2
    3
    4

$request_filename

参数: $request_filename
解释: 表示用户请求中的URI经过root或alias转换后的文件路径,默认是index.html
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "/usr/local/nginx/html/192.168.1.200"

    1
    2
    3
    4

$request_completion

参数: $request_completion
解释: 当请求已经全部完成时,其值为"OK"。若没有完成,就要返回客户端,则其值为空字符串;或者在断点续传等情况下使用HTTP range访问的并不是文件的最后一块,那么其值也是空字符串
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "OK"

    1
    2
    3
    4

$request_method

参数: $request_method
解释: 表示HTTP请求的方法名,如GET/POST/PUT等
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "HEAD"
访问: curl http://test.wanglei.com/192.168.1.200 -d "x=1" -I
返回: "POST"

    1
    2
    3
    4
    5
    6

$scheme

参数: $scheme
解释: 表示HTTP scheme,如在请求https中表示https,http中表示http
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "http"

    1
    2
    3
    4

$server_addr

参数: $server_addr
解释: 表示服务器地址
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "192.168.1.200"

    1
    2
    3
    4

$server_name

参数: $server_name
解释: 表示服务器名称
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "test.wanglei.com"

    1
    2
    3
    4

$server_port

参数: $server_port
解释: 表示服务器端口
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "80"

    1
    2
    3
    4

$server_protocol

参数: $server_protocol
解释: 表示服务器向客户端发送响应的协议,如HTTP/1.1或HTTP/1.0
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "HTTP/1.1"

    1
    2
    3
    4

$time_local

参数: $time_local
解释: 表示服务器当前的本地时间
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "25/Mar/2017:22:10:51 +0800"

    1
    2
    3
    4

$request

参数: $request
解释: 返回客户端请求的头部信息
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "HEAD /192.168.1.200?a=10 HTTP/1.1"

    1
    2
    3
    4

$status

参数: $status
解释: 表示客户端请求服务器的HTTP返回码
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "302"

    1
    2
    3
    4

$http_user_agent

参数: $http_user_agent
解释: 浏览页面的访问者在用什么操作系统(包括版本号)浏览器(包括版本号)和用户个人偏好的代码
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "curl/7.29.0"

    1
    2
    3
    4

$request_time

参数: $request_time
解释: 返回从接受用户请求的第一个字节到发送完响应数据的时间,即包括接收请求数据时间、程序响应时间、输出响应数据时间。
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "0.000"

    1
    2
    3
    4

$response_time

参数: $response_time
解释: 返回从Nginx向后端(upstream)建立连接开始到接受完数据然后关闭连接为止的时间。
访问: curl http://test.wanglei.com/192.168.1.200?a=10 -I
返回: "0.000"

你可能感兴趣的:(nginx)