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. <html>  
  2. <meta http-equiv="refresh" content="0;url=https://test.com/">  
  3. </html>  

 

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"

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Nginx强制转换为HTTPS,你需要进行以下步骤: 1. 首先,在Nginx配置文件中,添加一个新的server块来监听HTTP的80端口并进行重定向。在该server块中,使用error_page指令将所有HTTP请求重定向到HTTPS。可以参考以下配置示例: ``` server { listen 80; server_name test.com; return 301 https://$host$request_uri; } ``` 这将使用301状态码将所有HTTP请求重定向到对应的HTTPS地址。 2. 然后,在配置文件中的HTTPS server块中,配置SSL证书和私钥文件的路径,以及其他相关的SSL参数。可以参考以下配置示例: ``` server { listen 443 ssl; server_name test.com; ssl_certificate /etc/nginx/test.pem; ssl_certificate_key /etc/nginx/test.key; # 其他SSL参数配置 ... } ``` 确保将ssl_certificate和ssl_certificate_key指令中的路径替换为你实际的证书和私钥文件的路径。 3. 最后,重新加载Nginx配置文件使更改生效。可以使用以下命令重新加载Nginx: ``` sudo nginx -s reload ``` 这将重新加载配置文件并应用更改。 通过以上配置和步骤,Nginx将会强制将所有HTTP请求重定向为HTTPS请求。这样访问网站时,用户将自动跳转到安全的HTTPS连接。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [nginx强制使用https访问(http跳转https)](https://blog.csdn.net/mnasd/article/details/86522559)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Nginx配置自签证书强制跳转Https](https://blog.csdn.net/qq_42237234/article/details/121723109)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值