rewrite重写功能,在编译安装时需要有相应的模块,ngx_http_rewritte_module模块指令中,有if指令,return,set,break等指令。
1.ngx_http_rewrite_module模块指令
1.if指令
if指令在nginx配置中,用于条件判断,且仅支持单词判断,不支持使用if else或者if elif多重判断。
用法:
if (条件判断){
action;
}
使用正则表达式对变量进行匹配,匹配方式有=,!=,~,!~,~*等方式,如果匹配成功,就是true,否则为false。
测试是否为https和http方式:
前提是要有echo模块,在上一节nginx第三方模块详细解释
在location中:
scheme是指url前面的协议,如http://URL 或https://URL,就是指http或https
如果浏览器是http访问的,那么就输出这个scheme(http),如果是https访问的,那么就输出scheme(https)
重启:nginx -s reload,测试:
2.return指令
在loction添加一行:
格式:return code ; #返回给客户指定的HTTP状态码
return code [text]; #返回给客户端的状态码及响应报文的实体内容
return code url; #返回给客户端的URL地址
例子1:
当使用http访问时,执行return指令,如果执行return指令,那么就不会继续往下执行了
例子2:
访问:就会报404错误。
这是可以自定义的错误。403也可以
例子3:
这里默认为text/plain定义成文本格式后图形浏览器也可以看到
使用的浏览器通常是图形浏览器:此时再次访问:
例子4:
访问/test3转到百度的网页。
实现效果:我在浏览器上输入的是192.168.114.10/test3。它会自动跳转到百度的首页。
301永久重定向。 缓存在磁盘上,我们即使关闭nginx服务器。服务器不需要每次向客户提供新的url,客户访问过后会记录在自己的缓存中,即使nginx服务器死机,客户在一定时间内也可以继续访问
302 临时重定向。 没有缓存,服务器断开无法重定向
3.set指令
set指令与变量的用法类似,格式为:set $变量名 变量值;
如set $name linx;
echo $name;输出的是linx。
这里设置变量名为name,变量值为linx。取服务端的端口号作为值,赋给变量my_port
输出$name值为linx,my_port为80.
4.break指令
break用于中断当前相同作用域中的Nginx配置。在break前面的配置命令生效,在后面的配置,如果是ngx_http_rewrite_module模块中的指令则不再生效,其余的生效。
如果break指令在location块中后续指令还会继续执行,只是不执行ngx_http_rewrite_module模块的指令了,其他还是会执行的。
有以下location配置:
可以发现,break前面可以输出值linx,在break后面有两条打印输出,set指令属于ngx_http_rewrite_module模块中的指令,则不执行,echo "hello"属于第三方模块,会正常执行。验证:
2.rewrite指令
例如访问192.168.114.10/bj,不知道是访问北京还是访问宝鸡,使用rewrite指定是beijing还是baoji。
重写bj,例如访问192.168.114.10/bj/xxxxxxx,访问北京,(.*)代表任意个字符。那么就自动跳转到192.168.114.10/beijing/xxxxxxx,以/bj开头的,跳转到/beijing/$1,$1是后项引用,
rewrite有四种不同的flag,分别是redirect(临时重定向302)和permanent(永久重定向301),break和last。前两种是跳转型的flag,后两种是代理型。
主站点:
浏览器中输入192.168.114.10/bj。跳转到了192.168.114.10/beijing:
3.实现http转https的功能
https的配置在前面文章高级配置中第6个知识点有教程,这里不再赘述
在location中写入rewrite指令:
写一个全站跳转的,访问192.168.114.10时,默认是http,rewrite重写跳转到https。另一个是/login,访问/login时,跳转到https。浏览器要清楚缓存,否则会用影响。
验证1:192.168.114.10
验证2:192.168.114.10/login
4.防盗链
防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗链
在主页面html拖进来一个图片,网图(zyy.jpg),
在Node2上安装httpd:
[root@Node2 ~]#:yum install -y httpd
[root@Node2 ~]#:systemctl start httpd
[root@Node2 ~]#:cd /var/www/html/
vim index.html
<html>
<body>
<h1>this is zyy </h1>
<img src="http://192.168.114.10/zyy.jpg"/>
</body>
</html>
我们使用浏览器访问Node2:192.168.114.20
盗链,通过链接网站的图片,而不是打开了网站的整个页面
在location模块中,写入:
valid_referes中合法的值,none为空,blocked无效值或*.pc.com,pc.com,如果不是合法的,就返回一个403
可以发现已经获取不到了
-------end-------