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/

相关推荐
一心0925 小时前
ubuntu 20.04.6 sudo 源码包在线升级到1.9.17p1
运维·ubuntu·sudo·漏洞升级
好好学习啊天天向上5 小时前
世上最全:ubuntu 上及天河超算上源码编译llvm遇到的坑,cmake,ninja完整过程
linux·运维·ubuntu·自动性能优化
你想考研啊5 小时前
三、jenkins使用tomcat部署项目
运维·tomcat·jenkins
代码老y6 小时前
Docker:容器化技术的基石与实践指南
运维·docker·容器
典学长编程6 小时前
Linux操作系统从入门到精通!第二天(命令行)
linux·运维·chrome
DuelCode7 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
你想考研啊9 小时前
四、jenkins自动构建和设置邮箱
运维·jenkins
Code blocks9 小时前
使用Jenkins完成springboot项目快速更新
java·运维·spring boot·后端·jenkins
饥饿的半导体10 小时前
Linux快速入门
linux·运维
还是奇怪12 小时前
Linux - 安全排查 2
linux·运维·安全