Nginx ---- 高性能得WEB服务端(三)

一、重写功能   rewrite

Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一,重写功能(rewrite)用于实现URL的重写,URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为访问,另外还可以在一定程度上提高网站的安全性。更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求

1、ngx_http_rewrite_module模块指令

1.if指令

if (条件匹配) {   action
}

使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间使用以下符号链接:

​
=  #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!=  #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~  #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
举例:
location /main {index index.html;default_type text/html;
#定义文件类型if ( $scheme = http ){
#如果用户访问的协议是http,$scheme变量表示用户来访问使用的协议。       echo "if-----> $scheme";
#则输出if --->协议 }if ( $scheme = https ){
#如果用户访问的协议是https,$scheme变量表示用户来访问使用的协议。 echo "if ----> $scheme";
#则输出if --->协议 }

2.return指令

return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if 和 location块进行配置

www.kgc.com/test/
404
return code; #返回给客户端指定的HTTP状态码
return code [text]; #返回给客户端的状态码及响应报文的实体内容,可以调用变量,其中text如果有空格,需要用单或双引号
return code url; #返回给客户端的URL地址 
3字打头重定向
301  永久重定向  将缓存记录在浏览器中
302  临时重定向  没有缓存  每次都要重定向 

3.set指令

指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key,另外set定义格式为set $key value,value可以是text, variables和两者的组合。

server{listen 80;root /data/;server_name www.kgc.com;location /test {set $name kgc;echo $name;set $my_port $server_port;echo $my_port;}
}

4.break指令

用于中断当前相同作用域(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效,位于后面的 ngx_http_rewrite_module 模块中指令就不再执行,Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server块和location if块中使用

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

访问bj就跳转到beijing 

#############7-1 子配置###################[root@localhost ~]#vim /apps/nginx/conf.d/pc.conf 
server{listen 80;root /data;server_name www.kgc.com;location /bj {rewrite ^/bj/(.*) /beijing/$1 permanent;}
}[root@localhost ~]#nginx -t[root@localhost ~]#nginx -s reload[root@localhost ~]#cd /data/[root@localhost data]#mkdir /data/beijing[root@localhost data]#echo beijinghuanyingni > /data/beijing/index.html############7-2 访问#####################[root@localhost ~]#curl 192.168.10.101/bj/ -L
beijinghuanyingni[root@localhost ~]#curl 192.168.10.101/beijing -L
beijinghuanyingni

 

验证 

2、rewrite  指令

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理

官方文档:https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite

1.rewrite跳转实现

Nginx:通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else
跳转:从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
PCRE支持:perl兼容正则表达式的语法规则匹配
重写模块 set 指令:创建新的变量并设其值

2.rewrite 执行顺序

  1. 执行 server 块里面的 rewrite 指令。
  2. 执行 location 匹配。
  3. 执行选定的 location 中的 rewrite 指令

3.rewrite  语法格式

rewrite flag 使用介绍

利用nginx的rewrite的指令,可以实现url的重新跳转,rewrtie有四种不同的flag,分别是redirect(临时重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型。

  • 跳转型指由客户端浏览器重新对新地址进行请求
  • 代理型是在WEB服务器内部实现跳转

flag 说明

  • redirect;302
    • #临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
  • permanent;301       www.bj.com     www.beijing.com
    • #重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301
  • break;       www.bj.com
    • #重写完成后,停止对当前URL在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用 ,适用于一个URL一次重写 
  • last;
    • #重写完成后,停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,不建议在location中使用,会造成死循环,少用
      适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户301

正则表达式格式(regex)

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

1、访问bj就跳转到beijing

#############7-1 子配置###################[root@localhost ~]#vim /apps/nginx/conf.d/pc.conf 
server{listen 80;root /data;server_name www.kgc.com;location /bj {rewrite ^/bj/(.*) /beijing/$1 permanent;}
}[root@localhost ~]#nginx -t[root@localhost ~]#nginx -s reload[root@localhost ~]#cd /data/[root@localhost data]#mkdir /data/beijing[root@localhost data]#echo beijinghuanyingni > /data/beijing/index.html############7-2 访问#####################[root@localhost ~]#curl 192.168.10.101/bj/ -L
beijinghuanyingni[root@localhost ~]#curl 192.168.10.101/beijing -L
beijinghuanyingni

2、访问http就等于访问https

浏览器访问

3、last 和 break区别 

  • break适用于一个URL一次重写 

  • last会造成死循环,少用,适用于一个URL多次重写

[root@localhost ~]#vim  /apps/nginx/conf.d/pc.conf 
server{listen 80;root /data;server_name www.kgc.com;listen 443 ssl;ssl_certificate /data/ssl/www.kgc.com.crt;ssl_certificate_key /data/ssl/www.kgc.com.key;ssl_session_cache shared:sslcache:20m;ssl_session_timeout 10m;location /bj {rewrite ^/bj/(.*) /beijing/$1 permanent;}location / {if ( $scheme = http ) {rewrite /(.*) https://$host/$1 permanent;}}location /break {rewrite .* /test break;}location /last {rewrite .* /test last;}location /test {return 403;}
}[root@localhost ~]#nginx -t[root@localhost ~]#nginx -s reload

浏览器检测

3、防盗链

防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗链,referer就是之前的那个网站域名,正常的referer信息有以下几种:

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

nginx安全之防盗链设置,避免资源盗用以及节省带宽

去另一台访问

如果在电脑真机上做防盗链:

关于电脑真机中如何设置ip与域名的映射关系 

文件修改的时候进入属性——安全——编辑(指定当前用户)有写入的权限,及时修改 及时撤回!!!

改完真机域名后将原配置该回去,防止在原配置中出现乱码

然后去浏览器访问7-1  192.168.10.101/a.jpg

 然后去浏览器输入 7-2  192.168.10.102

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/493807.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

选择稳定代理IP需要考虑哪些因素?

很多人不知道怎么选择稳定的代理IP,也不知道当前代理IP套餐是否稳定,今天我们一起来分析下,选择稳定的代理IP可以从哪几方面去考虑。 1、代理IP的可用性 代理IP要稳定,先要可以用。一个代理IP池是否稳定,要看代理IP的…

微信小程序 wxs内联与外联的写法

内联写法 <!-- 内联wxs --> <view>大写字母{{m1.toUpper("xmly")}}</view> <wxs module"m1">module.exports.toUpperfunction(str){return str.toUpperCase()} </wxs> 外联写法 新建一个wxs文件 写一个函数&#xff0c;将…

c入门第二十四篇: 学生成绩管理系统优化(可执行文件传参)

前言 我&#xff1a;“师弟&#xff0c;review完你的代码之后&#xff0c;你觉得有没有什么地方可以优化&#xff1f;” 师弟一脸懵。 我&#xff1a;“比如&#xff0c;你把客户端和服务端的可执行文件生成之后&#xff0c;我把服务端部署到我的测试机器上&#xff0c;客户端…

springboot-基础-eclipse配置+helloword示例

备份笔记。所有代码都是2019年测试通过的&#xff0c;如有问题请自行搜索解决&#xff01; 目录 配置helloword示例新建项目创建文件 配置 spring boot官方有定制版eclipse&#xff0c;也就是STS&#xff0c;因为不想再装&#xff0c;所以考虑eclipse插件安装jdk和eclipse安装…

(AtCoder Beginner Contest 340) -- F - S = 1 -- 题解

目录 F - S 1&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 代码实现&#xff1a; F - S 1&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 这道题需要解决的就是三角形面积怎么用 A、B、X、Y&#xff0c;表示。 exgcd求解大致思路&#xff1a;可看C…

41.仿简道云公式函数实战-数学函数-SUMIF

1. SUMIF函数 SUMIF 函数可用于计算子表单中满足某一条件的数字相加并返回和。 2. 函数用法 SUMIF(range, criteria, [sum_range]) 其中各参数的含义及使用方法如下&#xff1a; range&#xff1a;必需&#xff1b;根据 criteria 的条件规则进行检测的判断字段。支持的字段…

【练习——打印每一位数】

打印一个数的每一位 举个例子&#xff1a;我们现在要求打印出123的每一位数字。我们需要去想123%10等于3&#xff0c;就可以把3单独打印出来了&#xff0c;然后再将123/10可以得到12&#xff0c;将12%10就可以打印出2&#xff0c;而我们最后想打印出1&#xff0c;只需要1%10就…

GEE入门篇|遥感专业术语(实践操作4):光谱分辨率(Spectral Resolution)

目录 光谱分辨率&#xff08;Spectral Resolution&#xff09; 1.MODIS 2.EO-1 光谱分辨率&#xff08;Spectral Resolution&#xff09; 光谱分辨率是指传感器进行测量的光谱带的数量和宽度。 您可以将光谱带的宽度视为每个波段的波长间隔&#xff0c;在多个波段测量辐射亮…

nginx设置缓存时间

一、设置缓存时间 当网页数据返回给客户端后&#xff0c;可针对静态网页设置缓存时间&#xff0c;在配置文件内的http段内server段添加location&#xff0c;更改字段expires 1d来实现&#xff1a;避免重复请求&#xff0c;加快访问速度 第一步&#xff1a;修改主配置文件 #修…

【力扣hot100】刷题笔记Day14

前言 又是新的一周&#xff0c;快乐的周一&#xff0c;快乐地刷题&#xff0c;今天把链表搞完再干活&#xff01; 114. 二叉树展开为链表 - 力扣&#xff08;LeetCode&#xff09; 前序遍历 class Solution:def flatten(self, root: Optional[TreeNode]) -> None:if not r…

实现点击按钮复制内容

记录一下点击按钮复制内容的实现。 实现效果如图&#xff1a; 复制成功后Ctrlv可粘贴&#xff1a; 实现方式也比较简单&#xff1a; <template><div><p>{{ myText }}</p><el-button plain click"handleCopy">复制</el-button>…

如何保护企业免受人工智能网络钓鱼攻击

文章目录 前言一、生成式人工智能带来了新的网络安全威胁二、人工智能将使网络钓鱼攻击变得更加危险三、企业如何阻止人工智能驱动的网络钓鱼四、网络钓鱼模拟确保责任感和适应性前言 网络钓鱼是网络犯罪分子社会工程武器库中的超级武器。网络钓鱼尤其危险,因为它是网络犯罪分…