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

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/

相关推荐
南棱笑笑生27 分钟前
20250512给NanoPi NEO core开发板在Ubuntu core20.04系统更新boot.img
linux·运维·ubuntu
小锋学长生活大爆炸1 小时前
【教程】Docker更换存储位置
运维·docker·容器
愚润求学1 小时前
【Linux】动静态库链接原理
linux·运维·服务器·开发语言·笔记
云攀登者-望正茂2 小时前
无缝部署您的应用程序:将 Jenkins Pipelines 与 ArgoCD 集成
运维·jenkins·argocd
勤不了一点2 小时前
小白上手RPM包制作
linux·运维·服务器·软件工程
麦a~M了M4 小时前
ansible
linux·运维·ansible
2501_906314325 小时前
MCP-RAG 服务器:完整设置和使用指南
运维·服务器
QQ_4376643145 小时前
Linux下可执行程序的生成和运行详解(编译链接汇编图解)
linux·运维·c语言·汇编·caffe
搬码临时工5 小时前
远程连接电脑的方法?异地远程桌面连接和三方软件实现
运维·服务器·网络·物联网·电脑·远程工作
窦再兴6 小时前
来一个复古的技术FTP
linux·运维·服务器