Nginx(十三)rewrite功能
一 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,ifrewrite按配置文件中出现的'顺序执行','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.html2)相当于'此时客户端的请求'是'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.html2)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详解
Nginx(十三)rewrite功能相关推荐
- Nginx的rewrite应用
Rewrite主要的功能是实现URL重写,Nginx 的 Rewrite 规则采用 PCRE Perl 兼容正则表达式的语法进行规则匹配,如相使用 Nginx 的 Rewrite 功能,在编译 Ngi ...
- nginx之ReWrite语法
转载自:https://www.cnblogs.com/crazylqy/p/6892010.html 1 ReWrite语法 Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现ur ...
- nginx rewrite功能使用
前言 大家在浏览某些网站的时候,有没有发现,当输入:www.abc.com或者www.abcd.com的时候,页面均能正常显示www.abc.com的主页内容.这就是nginx rewrite的一个使 ...
- nginx Rewrite功能配置
这里写目录标题 1功能简介 2 Rewrite的相关指令 2.1 set 指令 2.2 Rewrite常用全局变量 2.3 if 指令 2.4 break 指令 2.5 return 指令 2.6 r ...
- Nginx的重写功能——Rewrite
目录 Nginx常见模块 nginx内置模块 nginx配置文件的常见模块 location模块 常见的正则表达式 location常用的匹配规则 Rewrite模块 Rewrite功能 Rewrit ...
- Nginx之rewrite配置
Rewtrite : 其主要目的是为了进行URL 重写,进行URL重定向.主要采用PCRE: Perl Compatible Regular Expressions(Perl兼容正则表达式语法)进行规 ...
- Nginx的rewrite案例之目录合并
目录自动添加"/" 问题描述 通过一个例子来演示下问题: server {listen 80;server_name localhost;location / {root html ...
- Nginx的rewrite内容介绍
Rewrite功能配置 Rewrite是Nginx服务器提供的一个重要基本功能,是Web服务器产品中几乎必备的功能.主要的作用是用来实现URL的重写. 注意:Nginx服务器的Rewrite功能的实现 ...
- php选择nginx还是apache,浅谈apache和nginx的rewrite的区别
1. Nginx Rewrite规则相关指令 Nginx Rewrite规则相关指令有if.rewrite.set.return.break等,其中rewrite是最关键的指令.一个简单的Nginx ...
最新文章
- Linux Logwatch 使用说明
- scala Akka并发编程介绍
- PHP中empty,is_null,isset的区别
- mysql怎么对比表结构_mysql查看表结构2种方式对比
- Delphi通过管道执行外部命令行程序(cmd)并获取返回结果
- Linux之export命令
- Bailian2977 生理周期【枚举+中国剩余定理】
- 【html、CSS、javascript-9】jquery-选择器及过滤器
- 小编带着小白看springboot源码3
- EBS:AP_INV_SELECTION_CRITERIA_ALL
- 从D语言看C++ Template语法
- SAP R3 系统技术基础
- 树莓派 电脑 文件共享 搬移
- 《软技能-代码之外的生存指南》的读后感
- 数加生产制造执行系统(MES)——优势
- html使用阿里图标库(iconfont)制作字体图标
- 网易数帆云原生故障诊断系统实践与思考
- “喜之郎”签约企企通,加速企业的采购数字化转型
- 斯伦贝谢和IBM宣布推出面向能源行业的混合云企业数据管理解决方案
- table2Excel边框,自定义列宽,行高,文件名