nginx Rewrite
Rewrite相关功能
Nginx服务器利用ngx\_http\_rewrite\_module 模块解析和处理rewrite请求,所以说此功能依靠 PCRE(perl compatible regularexpression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为访问,另外还可以在一定程度上提高网站的安全性
ngx\_http\_rewrite\_module模块指令https://nginx.org/en/docs/http/ngx\\_http\\_rewrite\\_module.html
if指令
用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断
使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间使用以下符号链接
符号
说明
#比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false。
#比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false。
#表示在匹配过程中区分大小写字符,(可以通过正则表达式匹配),满足匹配条件为真,不满足为假。
#表示在匹配过程中不区分大小写字符,(可以通过正则表达式匹配),满足匹配条件为真,不满足问假。
#区分大小写不匹配,不满足为真,满足为假,不满足为真。
#为不区分大小写不匹配,满足为假,不满足为真。
判断请求的文件是否存在和是否不存在
#判断请求的目录是否存在和是否不存在。
#判断文件是否可执行和是否不可执行。
#判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)。
注: 如果$变量的值为空字符串或是以0开头的任意字符串,则if指令认为该条件为false,其他条件为true
set指令
指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key,另外set定义格式为set $key $value,及无论是key还是value都要加$符号
break指令
用于中断当前相同作用域(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效,位于后面的指令配置就不再生效了,Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server块和location块以及if块中使用
return指令
从nginx版本0.8.2开始支持,return用于完成对请求的处理,并直接向客户端返回响应状态码,比如其可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if和location块进行配置
rewrite\_log指令
设置是否开启记录
ngx_http_rewrite_module模块日志记录到error\_log日志文件当中,可以配置在http、server、location或if当中,需要日志级别为noticerewrite指令
通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理,以下是URL和URI的具体介绍
rewrite的官方介绍地址:https://nginx.org/en/docs/http/ngx\\_http\\_rewrite\\_module.html#rewrite, rewrite可以配置在server、location、if,其具体使用方式为
rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI
注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,\[flag\]所表示的标志位用于控制此循环机制,如果replacement是以http://或https://开头,则替换结果会直接以重向返回给客户端, 即永久重定向301
利用nginx的rewrite的指令,可以实现url的重新跳转,rewrtie有四种不同的flag,分别是redirect(临时重定向)、permanent(永久重定向)、break和last。其中前两种是跳转型的flag,后两种是代理型,跳转型是指有客户端浏览器重新对新地址进行请求,代理型是在WEB服务器内部实现跳转的。
Syntax: rewrite regex replacement \[flag\]; #通过正则表达式处理用户请求并返回替换后的数据包。
Default: —Context: server, location, if指令
说明
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301
#重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查;提前重启新一轮循环,不建议在location中使用
#重写完成后停止对当前URL在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用
rewrite案例-域名永久与临时重定向
要求:因业务需要,将访问源域名 www.final.com 的请求永久重定向到 final233.github.io
临时重定向不会缓存域名解析记录(A记录),但是永久重定向会缓存
永久重定向
域名永久重定向,京东早期的域名 www.360buy.com 由于与360公司类似,于是后期永久重定向到了 www.jd.com ,永久重定向会缓存DNS解析记录。
查看头部信息 status code: 301 move permanently (from disk cache)临时重定向域名临时重定向,告诉浏览器域名不是固定重定向到当前目标域名,后期可能随时会更改,因此浏览器不会缓存当前域名的解析记录,而浏览器会缓存永久重定向的DNS解析记录,这也是临时重定向与永久重定向最大的本质区别
URI 重定向
访问about的请求被转发至images,而访问images传递请求再次被转发至images1,以此测试last和break分别有什么区别
last与brak
自动跳转https
基于通信安全考虑公司网站要求全站https,因此要求将在不影响用户请求的情况下将http请求全部自动跳转至https,另外也可以实现部分location跳转
判断文件是否存在
Nginx防盗链
防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗链,referer就是之前的那个网站域名,正常的referer信息有以下几种
实现web盗链
在一个web 站点盗链另一个站点的资源信息,比如图片、视频等
图片源,受害者日志,查看referer

盗用者日志

实现防盗链
基于访问安全考虑,nginx支持通过ungx\_http\_referer\_module模块 https://nginx.org/en/docs/http/ngx\\_http\\_referer\\_module.html#valid\\_referers 检查访问请求的referer信息是否有效实现防盗链功能
图片源,可以看到只看1.jpg文件,状态返回403

盗用者日志还是有记录的,但图片无法访问了


小结
1、rewrite转到https
2、永久、临时重写向的区别,永久会缓存在浏览器,而临时不会缓存
3、break跳过不执行了
4、last会跳转localction继续执行匹配操作
5、输入一个不存在的页面自动跳转向首页或指定的页面,临时重定向302
6、实现防盗链
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 438803792@qq.com
Loading...
keepalived