当前位置: 首页 > news >正文

Nginux Rewte 相关功能

  • Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求

  • 此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库

  • rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能

比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为访问另外还可以在一定程度上提高网站的安全性。

1.1 模块指令
1.1.1 if 指令

用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断,用法如下:

if (条件匹配){
action
}
条件匹配成功是会认为是true,失败则是false

正则表达变量含义

 =                #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!=                 #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~                  #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~                 #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~*                 #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~*                 #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f          #判断请求的文件是否存在和是否不存在
-d 和 !-d         #判断请求的目录是否存在和是否不存在
-x 和 !-x         #判断文件是否可执行和是否不可执行
-e 和 !-e         #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false

配置示例location /test {index inde.html;default_type text/html;if ( $scheme = http ){echo "if----->$scheme";}}

测试:

[root@webserver ~]# curl timilee.org/test
if----->http
[root@webserver ~]#
1.1.2 set 指令

指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key

另外set定义格式为set $key value,value可以是text, variables和两者的组合

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {listen 80;server_name timinglee.org;root /web/nginx/lee/;location /test3{set $name lee;echo $name;}
}   
测试:
[root@web ~]# curl timinglee/test3
lee
1.1.3 break 指令

用于中断当前相同作用域(location)中的其他Nginx配置与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效位于后面的 ngx_http_rewrite_module 模块中指令就不再执行

Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置该指令可以在server块和locationif块中使用.

注意: 如果break指令在location块中后续指令还会继续执行,只是不执行 ngx_http_rewrite_module

模块的指令,其它指令还会执行

 location /test {index inde.html;default_type text/html;set $name haha;echo $name;break;set $port $server_port;echo $port;}
​
location /test {index inde.html;default_type text/html;     set $name haha;echo $name;set $port $server_port;echo $port;}

1.1.4 return 指令

return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重

定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配

置都将不被执行,return可以在server、if 和 location块进行配置

语法格式:

语法格式:return code; 			#返回给客户端指定的HTTP状态码
return code [text]; 	#返回给客户端的状态码及响应报文的实体内容#可以调用变量,其中text如果有空格,需要用单或双引号
return code URL; 		#返回给客户端的URL地址location /return/{default_type text/html;if ( !-e $request_filename){     #检测文件存不存在,不存在则转到百度页面,存在则打印出该文件及其路径 is existreturn 301 http://www.baidu.com;}echo "$request_filename is exist";}[root@webserver ~]# curl timilee.org/return/index.html  #文件存在
/web/nginx/lee/return/index.html is exist
[root@webserver ~]# curl timilee.org/return/index1.html #文件不存在
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.26.1</center>
</body>
</html>
location /test {index inde.html;default_type text/html;return 200 '{"status:""success"}';}测试:```
[root@webserver ~]# curl timilee.org/test
{"status:""success"}
[root@webserver ~]#
```
1.2rewrite指令

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,

rewrite主要是针对用户请求的URL或者是URI做具体处理

语法格式:

rewrite regex replacement [flag];

rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI

注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制

如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向301

正则表达含义:

. #匹配除换行符以外的任意字符
\w #匹配字母或数字或下划线或汉字
\s #匹配任意的空白符
\d #匹配数字
\b #匹配单词的开始或结束
^ #匹配字付串的开始
$ #匹配字符串的结束
* #匹配重复零次或更多次
+ #匹配重复一次或更多次
? #匹配重复零次或一次
(n) #匹配重复n次
{n,} #匹配重复n次或更多次
{n,m} #匹配重复n到m次
*? #匹配重复任意次,但尽可能少重复
+? #匹配重复1次或更多次,但尽可能少重复
?? #匹配重复0次或1次,但尽可能少重复
{n,m}? #匹配重复n到m次,但尽可能少重复
{n,}? #匹配重复n次以上,但尽可能少重复
\W #匹配任意不是字母,数字,下划线,汉字的字符
\S #匹配任意不是空白符的字符
\D #匹配任意非数字的字符
\B #匹配不是单词开头或结束的位置
[^x] #匹配除了x以外的任意字符
[^lee] #匹配除了lee 这几个字母以外的任意字符

1.2.1rewrite flag 使用介绍

利用nginx的rewrite的指令,可以实现url的重新跳转,rewrite有四种不同的flag,分别是redirect(临时

重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型

  • 跳转型指由客户端浏览器重新对新地址进行请求

  • 代理型是在WEB服务器内部实现跳转

1.2.2永久重定向与临时重定向
域名的临时的调整,后期可能会变,之前的域名或者URL可能还用、或者跳转的目的域名和URL还会跳
转,这种情况浏览器不会缓存跳转,临时重定向不会缓存域名解析记录(A记录),但是永久重定向会缓存。
示例: 因业务需要,将访问源域名 timinglee.org 的请求永久重定向到 timinglee.com

location / {
root /data/nginx/html/pc;
index index.html;
rewrite / http://timinglee.com permanent;}
#重启Nginx并访问域名 http://timinglee.org 进行测试

永久重定向301

域名永久型调整,即域名永远跳转至另外一个新的域名,之前的域名再也不使用,跳转记录可以缓存到
客户端浏览器
永久重定向会缓存DNS解析记录, 浏览器中有 from disk cache 信息,即使nginx服务器无法访问,浏览器也
会利用缓存进行重定向
比如: 京东早期的域名 www.360buy.com 由于与360公司类似,于是后期永久重定向到了 www.jd.com
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name timilee.org;
root /webdata/nginx/timilee.org/lee;
location / {
rewrite / http://timilee.com permanent;
}
}
server {
listen 80;
server_name timilee.com;
root /webdata/nginx/timilee.com/lee;
}
临时重定向302
域名临时重定向,告诉浏览器域名不是固定重定向到当前目标域名,后期可能随时会更改,因此浏览器
不会缓存当前域名的解析记录,而浏览器会缓存永久重定向的DNS解析记录,这也是临时重定向与永久
重定向最大的本质区别。
即当nginx服务器无法访问时,浏览器不能利用缓存,而导致重定向失败
示例
效果:
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {listen 80;server_name timilee.org;root /webdata/nginx/timilee.org/lee;location / {rewrite / http://timilee.com redirect;#rewrite / http://timilee.com permanent;}
}server {
listen 80;
server_name timilee.com;
root /webdata/nginx/timilee.com/lee;
}
1.2.3 break和last
 location /break/ {rewrite ^/break/(.*)  /test1/$1 break;rewrite ^/break/(.*)  /test2/$1;}location /last/{rewrite ^/last/(.*)  /test2/$1 last;rewrite ^/last/(.*)  /test1/$1;}location /test1/{return 200  "test1 ha";}location /test2/{return 200  "test2 haha";}

 1.2.4防盗链

在 Nginx 中,可以通过配置文件实现防盗链功能,防止其他网站未经授权直接链接到你的资源(如图片、视频、CSS、JS 等)。这不仅可以保护你的内容不被滥用,还能节省带宽和服务器资源。

防盗链的基本原理

防盗链的核心思想是检查 HTTP 请求头中的 Referer 字段。Referer 字段通常包含请求来源页面的 URL。通过验证这个字段,可以判断请求是否来自允许的网站。

配置解释:

none:  		#请求报文首部没有referer首部,#比如用户直接在浏览器输入域名访问web网站,就没有referer信息。
blocked: 	#请求报文有referer首部,但无有效值,比如为空。
server_names: #referer首部中包含本主机名及即nginx 监听的server_name。
arbitrary_string: #自定义指定字符串,但可使用*作通配符。
示例: 
*.timinglee.org 
www.timinglee.*regular expression: #被指定的正则表达式模式匹配到的字符串,要使用~开头,
例如:
~.*\.timinglee\.com

实现盗链

在RS1上配置apache

[root@web ~]# vim /var/www/html/index.html
html><head><meta http-equiv=Content-Type content="text/html;charset=utf-8"><title>盗链</title></head><body><img src="http://timilee.org/images/haha.png" > #这放置的是正常的图片<h4 style="color:red">欢迎大家</h4><p><a href=http://timilee.org>狂点这里</a>出门见喜</p></body>
</html>
写入域名解析
[root@web ~]# cat /etc/hosts
192.168.217.10  timilee.org
[root@web ~]#

实现防盗链

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {listen 80;server_name www.timinglee.org;root /data/web/html;index index.html;location / {valid_referers none blocked server_names *.timinglee.org ~/.baidu/.;if ($invalid_referer){return 404;}}location /images {valid_referers none blocked server_names *.timinglee.org ~/.baidu/.;if ($invalid_referer){rewrite ^/ http://www.timinglee.org/daolian.png permanent; #注意此图片
不能和正常图片放在一个目录中}}
}
#重启Nginx并访问测试

http://www.dtcms.com/a/312854.html

相关文章:

  • 基于Python实现生产者—消费者分布式消息队列:构建高可用异步通信系统
  • Rustdesk中继服务器搭建(windows 服务器)
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-56,(知识点:电源模块,DCDC电源,LDO电源,原理及其特点)
  • Java(HashMap和HashTable和Properties)
  • kafka 是一个怎样的系统?是消息队列(MQ)还是一个分布式流处理平台?
  • 哔哩哔哩招游戏内容产品运营
  • Ubuntu22.4部署大模型前置安装
  • 零确认双花攻击
  • 智变时代:AI 如何重构工作边界与行业生态?
  • 【软考中级网络工程师】知识点之 IS-IS 协议
  • 百度招黑产溯源安全工程师
  • Spring AOP_2
  • CPA全国青少年编程能力等级测评试卷及答案 Python编程(一级)
  • 【代码详解】Triplane Meets Gaussian Splatting中triplane部分解析
  • 【代码随想录|454.四数相加、383.赎金信、15.三数之和、18.四数之和】
  • 模拟-6.N字形变换-力扣(LeetCode)
  • GPIO交换矩阵和IO_MUX
  • Python Seaborn【数据可视化库】 全面讲解
  • node.js常用函数
  • web前端React和Vue框架与库安全实践
  • Elastic 9.1/8.19:默认启用 BBQ,ES|QL 支持跨集群搜索(CCS)正式版,JOINS 正式版,集成 Azure AI Foundry
  • Python爬虫实战:研究awesome-python工具,构建技术资源采集系统
  • 【C语言】结构体详解
  • 第15届蓝桥杯Scratch图形化国赛初/中级组2024年9月7日真题
  • 使用DrissionPage实现xhs笔记自动翻页并爬取笔记视频、图片
  • 禁闭求生2 免安 中文 离线运行版
  • 初识prometheus
  • 控制建模matlab练习04:二阶系统的时域响应
  • Supergateway教程
  • 前端技术制作简单网页游戏