8月8日上课内容 研究nginx组件rewrite

news/2024/10/23 11:24:46/

location 匹配uri

location 匹配的规则和优先级。(重点,面试会问,必须理解和掌握)

nginx常用的变量,这个要求掌握

rewrite:重定向功能。有需要掌握,有需要理解的。

location匹配:

正则表达式:

元字符:

. :任意单个字符,包括汉字         \.转义符才表示.

^:起始位置

$:结束位置

*:匹配前面的字符0次或者多次

+:匹配前面的字符一次或者多次。

?:匹配一次或0次

\:转义符

[0-9A-Za-z]:匹配0-9,A-Z,a-z。

[a]:只能匹配a

{n}:连续重复出现几次,不连续不算,只能连续出现

{n,m}:最少出现几次,最多几次

():分组

|:逻辑或

正则表达式:匹配的是文件内容。(命令结果也算)

URI:统一资源标识符。是一种字符串,主要用于标识抽象的或者物理资源

主要匹配:文件 图片 视频等

nginx当中:uri

www.ky30.com/images/1.jpg

location 就是用来匹配uri的:

1、精确匹配:location = / (...)

2、正则匹配:location ~ / (...)

3、一般匹配:location / (...)

匹配规则:

=:精确匹配,完全匹配,错一个字都匹配不到,必须完全一致。

^~:匹配普通字符,前缀匹配

~$:结束位置。

~:区分大小写的匹配

~*:不区分大小写的匹配,取的逻辑非,取反

!~:区分大小写的匹配,取得逻辑非,取反

!~*:不区分大小写的取反。

掌握前缀、后缀匹配,精确匹配,不区分大小写匹配即可

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

The “/” request will match configuration A, the “/index.html” request will match configuration B, the “/documents/document.html” request will match configuration C, the “/images/1.gif” request will match configuration D, and the “/documents/1.jpg” request will match configuration E.

官网的说明:

www.ky30.con/  www.ky30.com/test  www.ky30.com/document   www.ky30.com/images/

location越精确,越匹配(优先级越高)

http://www.example.com/gallery/images/cat.png
A)Location /gallery { }      
B)Location ~* /. (png|jpg)$ { }
C)Location = /gallery/images { }    
D)Location / { }

= /gally/images/cat.png
正确答案是B

匹配的优先级:

越精确,优先级最高

= 精确匹配优先级最高

~ 正则次之

/ 通用的优先级最低

例:

 

 精确匹配

把精确匹配注释掉之后:

优先级总结:

location = > location ^~ > location ~* > location /test/ > location /

完整路径 > 以什么为开头 > 不区分大小写匹配 > 标明路径 > 通用

一旦匹配到之后,不再向下匹配

生产中location匹配规则(面试题,很重要,必须掌握)

1、第一个规则:

location = / {}

直接匹配根网站,通过域名访问网站首页是最多的。使用精确匹配,可以加快处理速度。首页访问。(精确匹配)

2、第二个规则

处理静态文件请求,目录匹配
location ^~ /static/ {}(以什么为开头的格式,匹配静态页面)

3、location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {} 匹配图片用的

4、通用规则:

location / {
    proxy_pass ; 指定代理,反向代理,转发动态请求。.php.jsp的请求,发到后端
}

location /test/ {

}

nginx的内置变量:

$uri: 请求的URI,不包含主机和查询参数。

$request_uri: 请求的URI,包含主机和查询参数。

$args: 查询参数部分,即?后面的内容。

$query_string: 整个查询字符串,包含?。

$host: 请求的主机名。

$http_user_agent: 请求的User-Agent头信息,用于表示请求的客户端浏览器和操作系统。

$http_referer: 请求的Referer头信息,表示当前页面的来源URL。

$remote_addr: 客户端的IP地址。

$remote_port: 客户端的端口号。

$server_addr: 服务器的IP地址。

$server_port: 服务器的端口号。

$request_method: 请求的HTTP方法,如GET、POST、等。

$content_type: 请求的Content-Type头信息,表示请求体的MIME类型。

$content_length: 请求的Content-Length头信息,表示请求体的长度。

$scheme: 请求的协议,通常是http或https。

$request_filename: 请求的文件名,用于指定请求的实际文件路径。

$document_root: 当前请求的根目录。

$server_name: 服务器名称,用于匹配server块的server_name指令。

$remote_addr: 客户端的IP地址。

$remote_port: 客户端的端口号。

$server_addr: 服务器的IP地址。

$server_port: 服务器的端口号。

例: 

访问一下,就把客户端和服务端地址下载下来了

 

 打开看一下

如果不想下载下来,就再加一行

这个时候响应的内容就会直接反映在页面中,不会直接下载

再加上显示获取请求的方法:

响应类型:

default_type test/pain;

表示如果没有在其他地方显示设置,content-type的头字段,默认响应为test/explain纯文本格式

text/html: 默认的响应类型,也就是我们说的页面。

text/plain: 纯文本格式,类似于.txt文件

text/css: CSS样式表的类型,.css
text/javascript:java脚本,js。前端文件,也可以理解是java解析的程序文件

原始ip与真实ip(重点,需要记)

x_forwarded_for:用于获取HTTP请求头中的X-Forwarded-For字段的值。
X-Forwarded-For是一个常见的HTTP请求头,通常由代理服务器添加,用于指示原始客户端的IP地址。
proxy_set_header X-Forwarded-For $remote_addr; 这个是传给后端。

X-Real-IP:头部为客户端真实IP地址
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header指令来设置X-Real-IP头部的值为$remote_addr,即客户端的真实IP地址。
这样,Nginx会将客户端的真实IP地址作为X-Real-IP头部的值传递给后端服务器。

原始ip和真实ip地址这两个非常重要,是核心

不提供这两个ip,后端服务器会没有响应。

rewrite:重写,重定向

rewrite使用nginx的全局变量或者是自己设置的变量,结合正则表达式和标志位实现URL的重定向

rewrite的执行顺序:

1、先执行server块当中的rewrite

2、再执行location匹配

3、如果location当中还有rewrite,继续执行。

不停rewrite,会陷入死循环,只能10次,然后报错,报错的状态码:500。

rewrite的语法:

rewrite <regex> <replacement> [flag]

rewrite:开始重定向
regex :表示正则匹配规则。


replacement :表示跳转后的内容,你要重定向的内容。
 

flag :标志位。(也很重要)

permanent :返回码301,永久重定向

例:

 

(.*)什么内容,$1就是什么内容

请求一下,看一下效果

访问test,跳转到了ky30的内容

301永久重定向

200表示请求成功

 

redriect:临时重定向,显示的返回码:302

例:

vim nginx.conf

 重启一下服务,访问看一下

返回码变为302了

永久重定向与临时重定向总结: 

永久重定向:301,永久性的变更url,搜索引擎会转移它的权重以及排名到新的URL

临时重定向:302,用于短期变更(网站维护,或者升级更新。)搜索引擎是不会转移权重和排名到新的URL

304表示获取的是本地缓存

break

break:也是重定向,但是不会改变URL,而且只会请求一次。跳出当前匹配,即刻终止。

location / {

        rewrite /test/(.*) /ky30/$1 break;
        index index.html index.htm;

        }
也会跳转,uri没有发生变化,而且只会请求一次。

例:

 

rewrite与break区别图示:

rewrite:

break: 

 

last

last:本条负责匹配完成后,继续向下匹配,只要有last,就继续匹配。配置的时候需要注意,防止死循环


last:
  location /test1 {
         index index.html index.htm;
         rewrite /test1/(.*) /test2/$1 last;
        }

        location /test2 {
        index index.html index.htm;
        rewrite /test2/(.*) /test1/$1 last;

        }

        location /break {
        rewrite /break/(.*) /test1/$1 break;
        rewrite /test1/(.*) /test2/$1 break;
        index index.html index.htm;
        }

        location /last {
        rewrite /last/(.*) /test1/$1 last;
        rewrite /test1/(.*) /test2/$1 last;
        index index.html index.htm;
        }

重启一下,看一下日志文件:

"rewrite or internal redirection cycle while processing"是Nginx中的一个错误信息,
它表示在处理请求时发生了重写或内部重定向循环。

写成死循环,一直在匹配location,循环最多可以执行10次,超过后nginx将返回500错误

这个错误通常是由于配置文件中的重写规则导致了一个无限循环。当Nginx进行重写或内部重定向时,如果新的URI再次匹配了原始的重写规则,就会产生循环,并导致错误。

location ~*.(jpg|png)$

rewrite /.gif

总结:从功能看rewrite和location似乎有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,
而 location是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。

小实验:

基于域名的跳转

vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.kgc.com;
                                      #域名修改    
    #charset utf-8;
    #access_log  /var/log/nginx/kgc.com-access.log;                  #日志修改
    location / {
    #添加域名重定向
        if ($host = 'www.kgc.com'){                                #$host为rewrite全局变量,代表请求主机头字段或主机名
            rewrite ^/(.*)$ http://www.benet.com/$1 permanent;       #在重定向时,$1表示请求的URL
        }

        root   html;
        index  index.html index.htm;
    }

}

 

echo "192.168.233.61 www.kgc.com www.benet.com" >> /etc/hosts
systemctl restart nginx  把域名添加到hosts里面去

permanent
permanent: 永久性重定向,请求日志中的状态码为301。

实现效果:

访问kgc.com,跳转到了benet

 

F12看一下

也是请求两次,响应两次

 

基于ip地址的跳转

基于ip地址的跳转,用于页面维护,升级。

只有公司 IP :192.168.233.61访问正常。其他都显示维护中
vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.kgc.com;                       #域名修改    
    charset utf-8;
    access_log  /var/log/nginx/kgc.com-access.log;  #日志修改

    #设置是否合法的IP标记
    set $rewrite true;                             #设置变量$rewrite,变量值为boole值true
    
    #判断是否为合法IP
    if ($remote_addr = "192.168.233.61"){          #当客户端IP为192.168.233.61时,将变量值设为false,不进行重写
        set $rewrite false;
    }

                                                   #除了合法IP,其它都是非法IP,进行重写跳转维护页面
    if ($rewrite = true){                          #当变量值为true时,进行重写
        rewrite (.+) /error.html;                   #重写在访问IP后边插入/error.html,例如192.168.233.22/error.html
    }

    location = /error.html { #一定要用精确匹配
        root html;                                 #网页返回html/error.html的内容

        index  index.html index.htm;
    }
    
    location / {
        root   html;
        index  index.html index.htm;
    }
}

nginx -t 看看语法有没有错

再在html下创建一个error

systemctl restart nginx

 

只有 IP 为 192.168.233.61 能正常访问,其它地址都是维护页面

systemctl restart nginx.service 

验证一下:

只有允许的才能正常访问

 其他都是breaking

 

重点总结:

location = 优先级最高
location ^- /images/ 正则,以什么为开头location -*\.(pglpng)s 不区分大小写,匹配以。jpg或者png结尾的uri第三优先级location /test/ 通用完整路径
location/通用匹配
匹配到了不再向下匹配。优先级根据精确度,location匹配的是uri
rewrite:
标志位:
last
break
permanent
redirect
location /test/
#现在用户访问/ky30/返回ky30的用户信息
root html
html 创建ky30,
location /test1/


http://www.ppmy.cn/news/1016163.html

相关文章

leetcode2809. 使数组和小于等于 x 的最少时间 排序+0-1背包

https://leetcode.cn/problems/minimum-time-to-make-array-sum-at-most-x/ 给你两个长度相等下标从 0 开始的整数数组 nums1 和 nums2 。每一秒&#xff0c;对于所有下标 0 < i < nums1.length &#xff0c;nums1[i] 的值都增加 nums2[i] 。操作 完成后 &#xff0c;你…

Vue [Day5]

自定义指令 全局注册 和 局部注册 inserted在指令所在的元素 被插入到页面中时&#xff0c;触发 main.js import Vue from vue import App from ./App.vueVue.config.productionTip false// 1.全局注册指令 Vue.directive(focus, {// inserted在指令所在的元素 被插入到页…

react进阶

react-virtualized的高阶组件&#xff0c;Autosize可以使屏幕适配。使用render-props模式来获取到AutoSizer组件暴露的width和height属性。JSON.parse(JSON.stringify())不适用于有undefined的数据。 深拷贝的使用&#xff0c;不能使用在有undefined的数据中。有直接过滤undefi…

【Vue3】插槽全家桶

插槽&#xff08;Slots&#xff09;是 Vue.js 框架中的一个功能&#xff0c;允许在组件内部预留一些可替换的内容。通过插槽&#xff0c;可以给父组件填充模板代码&#xff0c;让父组件向子组件传递自定义的内容&#xff0c;以便在子组件中进行展示或处理。 1. 匿名插槽 Son.…

深入探索 Spring MVC:构建优雅的Web应用

文章目录 前言一、什么是 Spring MVC1.1 什么是 MVC1.2 什么是 Spring MVC 二、Spring MVC 项目的创建2.1 项目的创建2.2 第一个 Spring MVC 程序 —— Hello World 三、RequestMapping 注解3.1 常用属性3.2 方法级别和类级别注解3.3 GetMapping、PostMapping、PutMapping、Del…

【算法|数组】手撕经典二分法

算法|数组——二分查找 文章目录 算法|数组——二分查找引言二分查找左闭右闭写法左闭右开写法 总结 引言 首先学习这个算法之前需要了解数组知识&#xff1a;数组。 大概介绍以下&#xff1a; 数组是存储在连续内存空间上的相同类型数据的集合。数组下标都是从0开始。数组在…

深入探索C++模板:从基础到高级应用

目录 一、 泛型编程 1.1 为什么需要泛型编程&#xff1f; 二、模板 2.1 概念 2.2 函数模板 2.2.1 概念 2.2.2 语法 2.2.3 示例 2.2.4 模板实例化 隐式实例化 显示实例化 2.2.5 模板参数的匹配原则 2.3 类模板 2.3.1 概念 2.3.2 语法 2.3.3 示例 2.3.4 注意事项…

Unity游戏源码分享-塔防游戏保卫兔子的食物CarrotFantasy

Unity游戏源码分享-塔防游戏保卫兔子的食物CarrotFantasy 经典塔防游戏&#xff0c;可发布PC、Andoid、IOS、Web等 下载地址&#xff1a;https://download.csdn.net/download/Highning0007/88189987