38.nginx的rewrite跳转

rewrite跳转

  • Rewrite主要实现url地址重写,以及重定向,就是把传入 web 的请求重定向到其他 url 的过程。
  • 类似于超链接跳转网站

场景:

1、地址跳转,用户访问www.Izy.com这个URL时,将其定向至一个新的域名mobile.lzy.com
2、协议跳转,用户通过http协议请求网站时,将其重新跳转至https协议方式
3、伪静态,将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同时减少动态URL地址对外暴露过多的参数,提升更高的安全性。
4、搜索引擎,SEO优化依赖于url路径,好记的url便于支持搜索引擎录入

rewrite标签跳转

例如:

如果访问1.html最后访问返回的是b.html

server {
        listen 80;
        server_name test.oldboy.com;
        root /code/test/;

        location / {
        rewrite /1.html /2.html;     ###如果访问1.html跳转到2.html
        rewrite /2.html /3.html; 
        }

        location /2.html {
        rewrite /2.html /a.html;
        }

        location /3.html {
        rewrite /3.html /b.html;
        }
}

rewrite标记flag标签

flag作用
last本条规则匹配完成后,停止匹配,不再匹配后面的规则,浏览器重新对服务器发起请求
break本条规则匹配完成后,停止匹配,不再匹配后面的规则,返回当前资源
redirect返回 302 临时重定向,地址栏会显示跳转后的地址
permanent返回301临时重定向,地址栏会显示跳转后的地址

last例如:

加上last标签后,如果访问1.html最后访问返回的是a.html

[root@web01 conf.d]# cat re.conf
server {
        listen 80;
        server_name test.oldboy.com;
        root /code/test/;

        location / {
        rewrite /1.html /2.html last;
        rewrite /2.html /3.html; 
        }

        location /2.html {
        rewrite /2.html /a.html;
        }

        location /3.html {
        rewrite /3.html /b.html;
        }
}

break例如:

加上break标签后,如果访问1.html最后访问返回的是2.html

server {
        listen 80;
        server_name test.oldboy.com;
        root /code/test/;

        location / {
        rewrite /1.html /2.html break;  ###如果访问1.html跳转到2.html,
        rewrite /2.html /3.html; 
        }
}

redirect例如:

302临时重定向

类似跳板,临时域名跳域名,用户访问www.oldboy.com返回www.new.com然后用户浏览器再去访问new,每次都需要请求原站然后返回新站

server {
        listen 80;
        server_name test.oldboy.com;
        root /code;

        location /test {
                rewrite ^(.*)$  http://www.baidu.com redirect; #或者 return 301 ^(.*)$  http://www.baidu.com;
        }
}


然后访问,访问后,返回百度
然后停止nginx在访问测试,不能实现跳转

permanent例如:

301永久重定向,浏览器缓存

类似跳板,永久域名跳域名,用户访问www.oldboy.com返回www.new.com然后用户浏览器再去访问new,就算nginx挂掉,也能跳转到新站

server {
        listen 80;
        server_name test.oldboy.com;
        root /code;

        location /test {
                rewrite ^(.*)$  http://www.baidu.com permanent;   #或者 return 302 ^(.*)$  http://www.baidu.com; 
        }
}


然后访问,访问后,返回百度
然后停止nginx在访问测试,能实现跳转

rewrite资源跳转

  • 开启日志rewrite跳转绝对路径,rewrite_log on;

例如:

server {
    listen 80;
    server_name test.oldboy.com;
    root /code;
        location / {
                index index.html;
        }
        location /abc {
                rewrite (.*) /ccc/bbb/2.html redirect;   ##字符匹配 /abc (注意:字符匹配),或者用正则
                #return 302 /ccc/bbb/2.html;
        }
}

正则匹配方式
server {
        listen 80;
    server_name test.oldboy.com;
    root /code;
        location / {
                root /code;
                index index.html;
        }
        location ~ ^/abc$ {            # 必须为abc
                rewrite (.*) /ccc/bbb/2.html redirect;
                #return 302 /ccc/bbb/2.html;
        }
}

资源跳转使用后向引用的方式:

跳转到以前有的资源:

server {
        listen 80;
    server_name test.oldboy.com;
    root /code;
        location / {
                root /code;
                index index.html;
        }

         location /2024 {
                rewrite ^/2024/(.*)$ /2018/$1 redirect;

[root@web01 conf.d]# mkdir /code/2018/11/22/ -p
[root@web01 conf.d]# echo 2018的广告策划.. > /code/2018/11/22/3.html
[root@web01 conf.d]# cat /code/2018/11/22/3.html
2018的广告策划..



#反过来例子2:
server {
        listen 80;
        server_name test.oldboy.com;
        root /code;
        location / {
                root /code;
                index index.html;
        }

        location /2024 {
                rewrite ^/2024/(.*)-(.*).html$ /2018/$1/$2/index.html redirect;
        }
} 

浏览器访问测试:
test.oldboy.com/2024/11-22.html

在请求行添加参数

nginx中内置参数:

$args #这个变量等于请求行中的参数。

$content_length #请求头中的Content-length字段。

$content_type #请求头中的Content-Type字段。

$document_root #当前请求在root指令中指定的值。

$host #请求主机头字段,否则为服务器名称。

$http_user_agent #客户端agent信息

$http_cookie #客户端cookie信息

$limit_rate #这个变量可以限制连接速率。

$request_body_file #客户端请求主体信息的临时文件名。

$request_method #客户端请求的动作,通常为GET或POST。

$remote_addr #客户端的IP地址。

$remote_port #客户端的端口。

$remote_user #已经经过Auth Basic Module验证的用户名。

$request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。

$query_string #与$args相同。

$scheme #HTTP方法(如http,https)。

$server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$server_addr #服务器地址,在完成一次系统调用后可以确定这个值。

$server_name #服务器名称。

$server_port #请求到达服务器的端口号。

$request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。

$uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。

$document_uri #与$uri相同。

$X-Forwarded-For:HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。标准格式如下:

X-Forwarded-For: client1, proxy1, proxy2

# 当客户端为10.0.0.1时候,在请求行添加参数
[root@web01 conf.d]# cat re.conf 
server {
    listen 80;
    server_name test.oldboy.com;
    # $args为Nginx内置变量请求行的参数
    set $args "&showoffline=1";
    location / {
    root /code;
    index index.html;
    }
    if ($remote_addr = 10.0.0.1 ){        # 判断如果客户端是10.0.0.1 才执行下面的rewrite
    rewrite (.*) http://test.oldboy.com$1;
    }

}

错误页跳转

用法:

跳转维护页面,指定IP正常访问

[root@web01 conf.d]# cat re.conf 
server {
    listen 80;
    server_name test.oldboy.com;
    root /code;
    index index.html;

    location / {
        set $ip 0;       # 设置变量为0

        if ($remote_addr = "10.0.0.1"){
            set $ip 1;   # 如果来源IP为0.1则设置为1
        }

        if ($ip = 0){    # 判断如果变量为0 则跳转维护页面
            rewrite ^(.*)$ /wh.html break;
        }
    }


}
[root@web01 conf.d]# echo "目前网站正在维护中...." > /code/wh.html

劫持html

服务端服务器:

[root@web01 conf.d]# cat test.conf 
server {
         listen 80;
         server_name test.oldboy.com;
         root /code/test;
         index index.html;
 }


[root@web01 conf.d]# cat /code/test/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我是title</title>
</head>
<body>
<article>
  <header>
    <h1>我是妹妹</h1>
    <p>创建时间:<time pubdate="pubdate">2025/5/20</time></p>
  </header>
  <p>
    <b>Aticle</b>第一次用h5写文章,好他*的紧张...
  </p>
  <footer>
    <p><small>版权所有!</small></p>
  </footer>
</article>
</body>
</html>

中间劫持,hosts把域名解析到我们劫持机的ip

不改内容的话就成了一个反向代理跳板
这里直接修改源网站的内容

upstream jiechi {

        server 10.0.0.203:80;

}

server {

        listen 80;
        server_name test.oldboy.com;

        location /{

        proxy_pass http://jiechi;
        proxy_set_header Host $http_host;
        sub_filter '<h1>我是妹妹' '<h1>我是哥哥';
        sub_filter '<small>版权所有' ' <small>开源';
        }

}

https加密流程

  • 面试题: 说一下https的加密流程
1、网站会先找CA机构购买ssl证书,CA机构下发ssl证书,证书里面会有公钥、私钥、证书信息

2、网站部署证书

3、浏览器向网站发送请求,网站返回证书信息里面包含公钥。

4、浏览器找CA机构验证证书的合法性,如果不合法提示警告信息。如果合法则进行下一步

5、浏览器生成一个随机数,假设为x,并使用网站的公钥对x进行加密。

6、浏览器将加密的随机数x传送给服务器。

7、服务器用自己的私钥解密得到随机数是R。

8、服务器以随机数x为密钥使用了对称加密算法加密网页内容并传输给浏览器。

9、浏览器以随机数x为密钥,使用之前约定好的解密算法获取网页内容。

证书获取与部署

  1. 购买与下发证书
    网站运营方先向权威的 CA(Certificate Authority)机构购买 SSL 证书,CA 机构经过对网站相关信息(如域名归属、组织合法性等多方面)严格审核后,会下发 SSL 证书给网站。证书中包含公钥、与该公钥对应的私钥(私钥由网站自行妥善保管,CA 机构不会留存)以及证书自身的一些详细信息(比如证书的有效期、颁发机构、适用域名等)。
  2. 部署证书
    网站拿到证书后,需要将其正确部署到服务器端相应的配置中,使得服务器能够在接收到客户端请求时,按照规则向客户端返回证书相关内容,做好后续安全通信的前置准备。

客户端请求与证书验证

  1. 发送请求与接收证书信息
    当用户通过浏览器访问该网站时,浏览器会向网站所在的服务器发送请求,服务器收到请求后,按照配置会把证书信息(其中包含公钥)返回给浏览器,以便浏览器后续开展验证以及密钥协商等操作。
  2. 验证证书合法性
    浏览器收到证书后,会向 CA 机构验证证书的合法性。浏览器一般内置了众多权威 CA 机构的根证书,依靠这些根证书构建的信任链来核查收到证书的有效性,比如查看证书是否在有效期内、证书中的域名与正在访问的网站域名是否匹配、证书是否被吊销等情况。如果验证不通过,浏览器会向用户提示相应的警告信息,提醒可能存在的安全风险;若验证通过,则进入后续的密钥协商环节。

对称密钥协商与加密通信

  1. 生成并加密随机数
    浏览器在确认证书合法后,会生成一个随机数(示例中为 x),并利用从网站证书中获取的公钥对这个随机数进行加密。利用公钥加密能保证只有持有对应私钥的网站服务器才能解密该随机数,保障了密钥协商过程的安全性。
  2. 传输与解密随机数
    浏览器将加密后的随机数 x 传送给服务器,服务器收到后,使用自己持有的私钥进行解密,从而成功获取到这个随机数 x,该随机数后续就会充当对称加密的密钥。
  3. 加密与传输网页内容
    服务器以随机数 x 为密钥,选用合适的对称加密算法(例如 AES 等常用算法)对网页内容进行加密,然后将加密后的网页内容传输给浏览器。对称加密算法在处理大量数据传输时效率较高,适合后续频繁的数据交互场景。
  4. 解密获取网页内容
    浏览器接收到服务器发来的加密网页内容后,以之前协商好的随机数 x 作为密钥,使用相应的对称解密算法进行解密操作,最终获取到原始的网页内容,从而实现了安全且高效的数据传输,整个通信过程利用了非对称加密(用于协商对称密钥)和对称加密(用于实际数据加密传输)相结合的方式保障数据安全。

注:具体流程请观看 https证书.pdf说明文档

https的证书ssl

保护一个域名 www
通配符域名 *oldboycom
保护五个域名 www images cdn test m

对比域名型 DV企业型 OV增强型 EV
绿色地址栏小锁标记 + https小锁标记 + https小锁标记 + 企业名称 + https
一般用途个人站点和应用;简单的 https 加密需求电子商务站点和应用;中小型企业站点大型金融平台;大型企业和政府机构站点
审核内容域名所有权验证全面的企业身份验证;域名所有权验证最高等级的企业身份验证;域名所有权验证
颁发时长10 分钟 – 24 小时3-5 个工作日5-7 个工作日
单次申请年限1 年1-2 年1-2 年
赔付保障金125-175 万美金150-

https不支持续费,证书到期需要重新申请并进行替换
https不支持三级域名解析,如test.m.oldboy.com
https显示绿色,说明整个网站的url都是https的
https显示黄色,因为网站代码中包含http的不安全链接
https显示红色,那么证书是假的或者证书过期。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇