一 ngx_http_rewrite_module模块
1)Nginx服务器利用'ngx_http_rewrite_module 模块'解析和处理rewrite请求,此功能依靠 'PCRE(perl compatible regularexpression)',因此编译之前要安装PCRE库
2)rewrite是nginx服务器的重要功能之一,用于实现'URL的重写'
3)URL的重写'应用场景':比如它可以在我们'改变网站结构'之后,'不需要客户端修改'原来的书签,也无需其他网站修改我们的链接,就可以设置为访问
4)另外还可以在一定程度上提高'网站的安全性'
rewrite规则
++++++++++++++'补充'++++++++++++++
1) '|' -->用在(a|b)表示'或',任意匹配即可
2) '\' -->反斜杠转义;nginx中一般把'元字符'转变为普通字符;'域名'匹配
rewrite_log指令
设置'是否开启'记录ngx_http_rewrite_module模块日志记录到error_log日志文件当中,可以配置在'http、server、location或if'当中,需要'日志级别为notice'
备注: 调试时比较有用,可以看到'请求的次数'
Nginx的Rewrite规则编写实例
rewrite应用场景
二 关键标识
if、set、break、last、permanent、redirect、return
① if
参考博客
官网说: if 是为 rewrite 服务的,一般在'location'中定义
应用场景: 结合'变量'和'正则表达式'来使用
用于'条件匹配'判断,并根据'条件判断结果'选择不同的Nginx配置,可以配置在'server或location块'中进行配置
备注:nginx的'if语法'仅能使用if做'单次判断','不支持'使用if else或者if elif这样的'多重判断','也不支持'多个条件逻辑'&&和||'处理,也不支持if的'嵌套'语法
正则匹配案例
set $domainWhitelist "yahoo\.com|google\.com|foo\.com";
if ($http_origin ~* "https?://([\w-]*\.)*($domainWhitelist)(:\d+)?") {
...
}
防盗链$http_referer
防盗链;其它参考;最佳参考
利用nginx限制HTTP的请求方法
1)'^': 匹配字符串的'开始位置';
2) $ : 匹配字符串的'结束位置';
3).* : .匹配'任意单个字符'-->字符,'*'匹配'字符数量'-->'0到正无穷';
4)\. : 斜杠用来转义,'\.匹配 .' -->例如'匹配ip'就需要转义
5)(值1|值2|值3|值4):或匹配模式,例:'(jpg|gif|png|bmp)'匹配jpg或gif或png或bmp
rewrite可使用的全局变量
② set
语法:setvariable value ;
默认值:none;
使用环境:'server,location,if';
功能: 指定key并给其'定义一个变量'
扩展用法: 变量可以调用Nginx'内置变量赋值给key'
表现形式: set定义格式为"set $key $value",及无论是key还是value都要'加$符号'
三 rewrite规则
1)rewrite指令
'作用域': server,location,if
rewrite按配置文件中出现的'顺序执行','flags标志'可以停止继续处理
+++++++++++++'flags参数'+++++++++++++
1)last 停止处理后续rewrite指令集,然后对'当前重写的新URI'在rewrite指令集上'重新查找'
2)break 停止处理后续rewrite指令集,'并不再重新查找',但是'当前location内'剩余'非rewrite语句'和'location外'的的'非rewrite语句'可以执行
3)redirect 返回'302临时'重定向
4)permant 返回'301永久'重定向
Nginx中rewrite指令注意事项
② nginx rewrite指令执行顺序
1)执行'server块'的rewrite指令(这里的块指的是'server关键字后{}包围的区域')
2)执行'location匹配'
3)执行选定的'location中的rewrite'指令
备注:如果其中'某步URI被重写',则'重新循环执行1-3',直到找到'真实存在的文件'
注意:如果'循环超过10次',则'返回500 Internal Server Error'错误 -->可能'死循环'场景
http调转到https的三种方式
③ last
环境: 'last、reak指令'主要是应用在'rewrite、return指令'中
+++++++++++'对比实验'+++++++++++
last 停止rewrite检测 【如果'没有匹配到',会'继续向下'匹配】
break 停止rewrite检测【如果'没有匹配到',则'不再向下'匹配,直接返回结果404】
redirect 返回302临时重定向,'地址栏'会'显示跳转后的地址'
permanent 返回301永久重定向,地址栏会'显示跳转后的地址'
对比前
1)准备相应的资源文件
2)修改配置文件
3)测试
对比后
3)last 结论
1)url由'重写前'的http://nginx.wzj.com/aaa/index.html变为'重写后'的http://nginx.wzj.com/bbb/index.html
2)相当于'此时客户端的请求'是'http://nginx.wzj.com/bbb/index.html',会重新进行location匹配后,'匹配到第二个location条件',所以请求url'得到的响应是hello wold'
更准确的理解: 相当于'外部'发送了'两次请求'
注意: 而'不是/bbb/index.html'的'bbb'信息输出,'跨location'
④ break
1)用于'中断'当前'相同作用域'(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位于它'前面的配置生效',位于'后面的指令配置'就'不再生效了'
2)Nginx服务器在根据'配置处理请求的过程中'遇到该指令的时候,'回到上一层作用域'继续'向下读取'配置,该指令可以在'server块'和'location块'以及'if块'中使用
1)测试1
location /login {
default_type text/html;
index index.html;
#自定义一个变量"$name",其值为"wzj_110"
set $name "wzj_110";
说明:使用break后,其'下面的其它指令'将'不会继续执行'
break;
#自定义一个变量"$my_port",其值是通过调用Nginx内置变量"$server_port"得到的
set $my_port $server_port;
echo $name;
echo $my_port;
}
2)死循环
3)接last的实验,将flags中last标识改成break
1)url由'重写前'的http://nginx.wzj.com/aaa/index.html变为'重写后'http://nginx.wzj.com/bbb/index.html
2)nginx按照'重写后的url'进行资源匹配,匹配到的'资源文件'是/usr/share/nginx/html/bbb/index.html
备注: 此时由于'break'不会进行新的location匹配,而把'重写后的url'请求作为服务器对应的'资源文件'进行查找,找不到则返回'404'错误
3)所以'原始请求url得到的响应'就是/usr/share/nginx/html/bbb/index.html'文件中的内容'--->'bbb'
⑤ nginx rewrite last和break区别
last 停止rewrite-->如果'没有匹配到',会继续'向下匹配',如果'匹配到',会'重新发起'匹配
break 停止rewrite-->如果'没有匹配到',则'不会向下匹配',返回404
实验的博客
配置rewrite 'last'时,请求'跳出当前location',进入server块,重新进行location匹配,'超过10次匹配不到'报500错误,客户端的url不变
配置rewrite 'break'时,请求'不会跳出'当前location,但'资源匹配会按照重写后的url进行',如果location里面'配置的是proxy_pass'到后端,'后端服务器'收到的请求url也会是'重写后的url',客户端的url不变
核心:当用'break修饰'的时候,表示'立即返回当前资源'
四 return
++++++++++++++'return指令'++++++++++++++
语法:return code;
return code URL;
'作用域':server,location,if
停止处理-->'并返回'指定状态码(code)给客户端
常使用: 403、404、500、503、504
特殊:非标准状态码'444'表示'关闭连接且不给客户端发响应头'
return 支持'响应URL重定向'(对于301,302,303,307),或者'文本响应'(对于其他状态码).对于文本或者URL重定向可以'包含变量'
+++++++++++++'应用场景'+++++++++++++
从nginx版本'0.8.2'开始支持,return用于完成对请求的处理,并'直接向客户端返回'响应状态码
场景: 其可以指定'重定向URL'(对于特殊重定向状态码,301/302等) 或者是'指定提示文本内容'(对于特殊状态码403/500等),处于此指令后的所有配置'都将不被执行'
五 nginx代理https强制http跳转https
① 方式一
说明: '官方推荐'-->80和443分别在'不同的server'中
server {
listen 80;
...
return 301 https://$server_name$request_uri;
# rewrite ^(.*)$ https://$host$1 permanent; -->'二者等价'
}
server {
listen 443;
...
}
② 方式二
if ($scheme = 'http') {
return 301 https://$server_name$request_uri;
}
'等价方式'
if ( $scheme = 'http' ){
rewrite ^(.*)$ https://$host$1 permanent;
}
+++++++++++++++在'一个server段'里'同时监听80和443'端口+++++++++++++++
server {
listen 80;
listen 443;
server_name www.wzj.com;
ssl on;
ssl_certificate /data/www-key/xxx.pem;
ssl_certificate_key /data/www-key/xxx.key;
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
}
可能出现的问题: 无论'是http还是https'都会'无限地重定向'下去,在这种情况下Chrome会报"重定向循环"的错误
六 nginx中 $1,$2,$3是什么
'( )' -->用于'匹配括号之间'的内容,通过'$1、$2'调用
参考博客
七 try_files
nginx配置选项try_files详解