Nginx之Rewrite规则
IF语句:
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_rewrite_module.html#if
首先申明nginx只有if语句做判断适应,没有else语句
if语句的常用形式如下:
if(condition){
... ;
}
默认值: —
应用位置: server、location
计算指定的condition的值。如果为真,执行定义在大括号中的指令,并将if指令中的配置指定给请求。if指令会从上一层配置中继承配置。
条件可以是下列任意一种:
变量名;如果变量值为空或者是以"0"开始的字符串,则条件为假;
使用 = 和 != 运算符比较变量和字符串;
使用 ~(大小写敏感)和 ~*(大小写不敏感)运算符匹配变量和正则表达式。正则表达式可以包含匹配组,匹配结果后续可以使用变量$..$9引用。如果正则表达式中包含字符'}'或者';',整个表达式应该被包含在单引号或双引号的引用中。
使用 -f 和 !-f 运算符检查文件是否存在;
使用 -d 和 !-d 运算符检查目录是否存在;
使用 -e 和 !-e 运算符检查文件、目录或符号链接是否存在;
使用 -x 和 !-x 运算符检查可执行文件;
rewrite语法:
指令语法:rewrite regex replacement[flag];
默认值:none
应用位置:server、location、if
rewrite是实现URL重定向的重要指令,他根据regex(正则表达式)来匹配内容跳转到replacement,结尾是flag标记
简单的小例子:
if ($request_uri ~* "tobd") {
rewrite ^/(.*) http://www.baidu.com/ permanent; # 如果匹配成功后跳转到百度,执行永久301跳转
}
常用正则表达式:
字符 | 描述 |
\ | 将后面接着的字符标记为一个特殊字符或者一个原义字符或一个向后引用 |
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或者多次 |
+ | 匹配前面字符串一次或者多次 |
? | 匹配前面字符串的零次或者一次 |
. | 匹配除“\n”之外的所有单个字符 |
(pattern) | 匹配括号内的pattern |
rewrite 最后一项flag参数:
标记符号 | 说明 |
last | 本条规则匹配完成后继续向下匹配新的location URI规则 |
break | 本条规则匹配完成后终止,不在匹配任何规则 |
redirect | 返回302临时重定向 |
permanent | 返回301永久重定向 |
1、基础知识点
(1)Rewirte规则也称为 规则重写,主要功能是实现浏览器访问HTTP URL的跳转,其正则表达式是基于Perl语言。
(2)对收缩引擎优化(SEO),利于收索引擎抓取网站页面。
(3)隐藏网站URL真实地址。
(4)网站变更升级,可以基于Rewrite临时重定向到其他页面。
(5)有利于服务器实现伪静态。
2、Rewrite结尾表示符
(1)last:相当于apache里的(L)标记,表示完成rewrite匹配。(浏览器地址栏URL地址不变)
(2)break:本条规则匹配完成后,终止匹配,不再匹配后面的规则。(浏览器地址栏URL地址不变)
(3)redirect:返回302临时重定向,浏览器地址栏会显示跳转后的URL地址。
(4)permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。
3、Rewrite规则常用表达式
(1) . 匹配任何单字符;
(2)? 匹配0到1个字符;只匹配一次;
(3)* 匹配0到多个字符;
(4)+ 匹配1到多个字符;
(5)[0-9] 匹配字符串0-9
(6)[^0-9] 不匹配字符串0-9
(7)^ 字符串开始标志
(8)$ 字符串结束标志
(9)\n 转义换行标志
4、Nginx Rewrite变量常用于匹配HTTP请求头信息、浏览器主机名、URL等。
5、Rewrite配置在nginx的location块中的配置
(1)将dks.net跳转至www.dks.net
if($host='dks.net') {
rewrite ^/(.*)$ http://www.dks.net/$1 permanent;
}
# $host内置nginx变量,匹配用户访问的域名
# $1表示引用第一个括号的内容,是用户输入的内容;如果不使用$1引用,则只会匹配根
(2)将访问www.dks.net/跳转至www.test.com/new.index.html
rewrite ^/$ http://www.test.com/new.index.html permanent;
(3)访问 /dks/test01/跳转至/newindex.html,浏览器地址不变
rewrite ^/dks/test01/$ /newindex.html last;
(4)多域名跳转 www.dks.net
if($host!='www.dks.net') {
rewrite ^/(.*)$ http://www.dks.net/$1 permanert;
}
(5)访问文件和目录不存在跳转至index.php
!-f 和 -f 判断文件
!-d 和 -d 判断目录
!-e 和 -e 判断文件和目录
!-x 和 -x 判断文件是否可执行
if(!-e $request filename) {
rewrite ^/(.*) /index.php last;
}
(6)目录对换 /xxx/123456——> /xxx?id=123456
\d+ 代表匹配数字,相当于[0-9]
rewrite ^/(.+)/(\d+) /$1?id=$2 last;
(7)判断浏览器User Agent跳转
if($http_user_agent ~MSIE) {
rewrite ^(.*)$/ie/$1 break;
}
(8)禁止访问以.sh | .flv | .mps为文件后缀的文件
location ~.*\.(sh|flv|mp3)$ {
return 403;
}
(9)将移动用户访问跳动至移动端。
if($http_user_agent ~* "(Android)|(iphone)|(Mobile)|(WAP)|(UCWEB)") {
rewrite ^/$ http://m.dks.net/ permanent;
}
(10)匹配URL访问字符串跳转
if($args ~* tid=13) {
return 404;
}
(11)访问/10690/dks/123 跳转至/index.php?tid/10690/items=123
rewrite ^/([0-9]+)/dks/(.+)$ /index.php?tid/$1/items=$2 last;
6、多rewrite规则跳转
rewrite ^/dks/(.*)/$ /newindex.html permanent; #可以跳转
rewrite ^/newindex.html$ /dks/test01/index.html permanent;
rewrite ^/dks/(.*)/$ /newindex.html break; #break 终止跳转,执行下一条rewrite规则
rewrite ^/newindex.html$ /dks/test01/index.html permanent;
rewrite ^/dks/(.*)/$ /newindex.html last; #last 跳转,但下面那条rewrite规则匹配不上,因为last使地址栏url地址不变,所以下面的那条rewrite规则匹配不上;
rewrite ^/newindex.html$ /dks/test01/index.html permanent; #此条规则匹配不上上边的url地址
Nginx之Rewrite规则的更多相关文章
- Nginx的Rewrite规则与实例
通过Rewrite规则可以实现规范的URL.根据变量来做URL转向及选择配置,用好Rewrite有时起到事半功倍的效果. 语法 Nginx的Rewrite相比Apache的要好理解很多,主要使用指令有 ...
- Apache和Nginx的Rewrite规则对比
一.Apache的rewrite 1.Rewrite规则简介: Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基于服务器级的(httpd.conf)和目录级的(.h ...
- Nginx 设置rewrite规则是遇到的一个{}大括号引发的报错问题
一个群友提到: 用nginx image_filter模块裁图,用!拼宽高能够实现,现在想用参数传宽高总是报错,配置如下: location ~ ^/images/.* { if ( $q ...
- Nginx 之 Rewrite 规则
write 规则介绍 Rewite 规则作用 Rewrite规则可以实现对url的重写,以及重定向 作用场景: URL访问跳转,支持开发设计,如页面跳转,兼容性支持,展示效果等 SEO优化 维护:后台 ...
- nginx 带? rewrite 规则
由于需要重定向 url ,nginx需要rewrite .参考文献 http://huangqiqing123.iteye.com/blog/2083434 需求:将http://10.106.1.3 ...
- nginx 重定向 rewrite 规则
1.rewrite配置 server { listen 80 default_server; server_name jeson.t.imooc.io; access_log /var/log/ngi ...
- 修改Nginx 伪静态Rewrite规则 安装Chevereto
Chevereto 是目前最为强大的 PHP 图床系统,通过它可部署多用户公开或私有的图片存储服务,现在 Chevereto 出了免费的版本,小伙伴可以围观一下. https://github.com ...
- nginx的rewrite规则
301跳转: server { listen 80; server_name www.xiaofan.com; return 301 https://$server_name$request_uri; ...
- Nginx配置location总结及rewrite规则写法
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 32.0px "Helvetica Neue"; color: #323333 } p. ...
随机推荐
- 逻辑回归 之 Logist 推导
Logist从概率角度认识 可以咱学校教材大二版的<> - 山大版, 来整一波, 为了简化推导形式呢, 这里就假设2个样本空间的形式来展开, 基于(条件概率) 全概率与贝叶斯 作为核心. ...
- windows系统将Tomcat将控制台的日志重定向到日志文件
1 . 修改startup.bat 将 56 行注释,加上一行: call "%EXECUTABLE%" run %CMD_LINE_ARGS% >> ..\logs\ ...
- 自定义View(五),onLayout
转自http://blog.csdn.net/a396901990/article/details/38129669 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onM ...
- C++使用通配符查找文件(FindFirstFile)
调用 FindFirstFile 和 FindNextFile 可搜索某个目录下的相应文件. BOOL SearchFilesByWildcard(WCHAR *wildcardPath) { HAN ...
- jmeter 使用命令行执行
一般情况我们在设计脚本的时候,可以使用界面执行. 实际在压测的时候,我们可以使用命令行在后台执行. jmeter -n -t D:\document\bgy\jemeter\Script1.jmx - ...
- linux设备驱动程序-i2c(0)-i2c设备驱动源码实现
(基于4.14内核版本) 为了梳理清楚linux内核中的i2c实现框架,从本文开始,博主将分几个章节分别解析i2c总线在linux内核中的形成过程.匹配过程.以及设备驱动程序源码实现. 在介绍linu ...
- JavaSE理论篇
将已学过的知识记录在此,既能便于以后温习又能方便知识共享,做到共同成长. 计算机语言发展简史 主要分为三个阶段 机器语言:打点机,有点表示1,没有表示0,打点计时器 低级语言:汇编语言 高级语言:Ja ...
- ShareSDK For Unity集成
Mob ShareSDK Android - V2.7.10 iOS - V3.5.0 Mob下载:https://github.com/MobClub/New-Unity-For-ShareSDK ...
- saas系统多租户数据隔离的实现(一)数据隔离方案
0. 前言 前几天跟朋友聚会的时候,朋友说他们公司准备自己搞一套saas系统,以实现多个第三方平台的业务接入需求.聊完以后,实在手痒难耐,于是花了两天时间自己实现了两个saas系统多租户数据隔离实现方 ...
- HDU3572 Task Schedule(最大流+构图思维)
题意: 有N个任务M个机器,给每个任务i完成所花费的时间Pi且每个任务要在第Si天后开始,在第Ei天前结束,保证任务在(S,E)之间一定能完成. 每个机器在一天里只能运行一个任务,一个任务可以在中途更 ...