引言
Rewrite 主要 的 功能 就是 实现 URL 的 重写, Nginx 的 Rewrite 规则 采用 PCRE( Perl Compatible Regular Expressions),pcre是一个Perl库,包括 perl 兼容的正则表达式库, 如果需要 Nginx 的 Rewrite 功能, 在 编译 Nginx 之前, 须要 编译 安装 PCRE 库(yum -y install pcre-devel)。
if、 rewrite、 set、 return、 break 等指令的灵活配合,可以配置出各种各样的规则
参数介绍
rewrite 指令
指令语法:rewrite regex replacement[flag];
应用位置:server、location、if
rewrite是实现URL重定向的重要指令,
regex:用来匹配URI的正则表达式;
replacement:匹配成功后用来替换URI中被截取内容的字符串,默认情况如果该字符串包含“http://”、"https://"开头,则不会继续向下对URI进行其他处理。直接返回重写的URI给客户端
flag:用来设置rewrite对URI的处理行为,包含如下数据:
标记符号 | 说明 |
last | 本条规则匹配完成后继续向下匹配新的location URI规则 |
break | 本条规则匹配完成后终止,不在匹配任何规则 |
redirect | 返回302临时重定向 |
permanent | 返回301永久重定向 |
last 和 break 用来 实现 URI 重写, 浏览器 地址 栏 的 URL 地址 不变, 但在 服务器 端 访问 的 路径 发生了 变化。
redirect 和 permanent 用来 实现 URL 跳 转, 浏览器 地址 栏 会 显示 跳 转 后的 URL 地址。
last 和 break 标记 的 实现 功能 类似, 但 二者之间 有 细微 的 差别:
使用 alias 指令 时必 须用 last 标记, 使用 proxy_ pass 指令 时 要 使用 break 标记。
last 标记 在 本条 rewrite 规则 执行 完毕 后, 会对 其所 在的 server{......} 标签 重新 发起 请求, 而 break 标记则在 本条 规则 匹配 完成 后, 终止 匹配, 不再 匹配 后面 的 规则。
break指令
语法: break
使用 环境: server, location, if
该 指令 的 作用 是 完成 当前 的 规则 集, 不再 处理 rewrite 指令。
if ($slow) {
limit_rate 10k;
break;
}
if指令
语法: if (condition) {...}
使用 环境: server, location
该 指令 用于 检查 一个 条件 是否 符合, 如果 条件 符合, 则 执行 大 括号 内 的 语句。 if 指令 不支持 嵌套, 不支持 多个 条件&& 和 ||处理。
以下 信息 可以 被指 定为 条件:
(1) 变量 名, 错误 的 值 包括: 空 字符串"", 或者 任何 以 0 开始 的 字符串;
(2) 变量 比较 可以 使用“=”( 表示 等于) 和“!=”( 表示 不等于) 运算符;
(3) 正 则 表达式 模式 匹配 可以 使用“~*” 和“~” 符号;
(4)“~” 符号 表示 区分 大小 写字 母的 匹配;
(5)“~*” 符号 表示 不 区分 大小 写字 母的 匹配( 例如 firefox 与 FireFox 是 匹配 的);
(6)“!~” 和“!~*” 符号 的 作用 刚好 和“~”、“!~*” 相反, 表示 不匹配;
(7)“- f” 和“!- f” 用来 判断 文件 是否 存在;
(8)“- d” 和“!- d” 用来 判断 目录 是否 存在;
(9)“- e” 和“!- e” 用来 判断 文件 或 目录 是否 存在;
(10)“- x” 和“!- x” 用来 判断 文件 是否 可执行。 部分 正 则 表达式 可以 在 圆括号“()” 内, 其 值 可以 通过
举例如下
return指令
语法: return code
使用 环境: server, location, if
该 指令 用于 结束 规则 的 执行 并 返回 状态 码 给 客户 端。 状态 码 可以 使用 这些 值: 204, 400, 402 ~ 406, 408, 410, 411, 413, 416 及 500 ~ 504。 此外, 非标准 状态 码 444 将以 不发 送 任何 Header 头 的 方式 结束 连接。
示例, 如果 访问 的 URL 以“. Sh” 和“. Bash” 结尾, 则 返回 状态 码 403:
location ~ .*\.(sh|bash)?${
return 403;
}
相关全局变量
在 if、 location、 rewrite 指令 中, 可以 使用 以下 全局 变量:
· $ args
· $ content_ length
· $ content_ type
· $ document_ root
· $ document_ uri
· $ host
· $ http_ user_ agent
· $ http_ cookie
· $ limit_ rate
· $ request_ body_ file
· $ request_ method
· $ remote_ addr
· $ remote_ port
· $ remote_ user
· $ request_ filename
· $ request_ uri
· $ query_ string
· $ scheme
· $ server_ protocol
· $ server_ addr
· $ server_ name
· $ server_ port
· $ uri
案例
基本
server {
listen 80;
server_name xxx.com;
# 永久重定向到www.xxx.com
}
防盗链
防盗链:如果你的网站是个下载网站,下载步骤应该是先经过你的主页找到下载地址,才能下载,为了防止某些网友直接访问下载地址完全不通过主页下载,我们就可以使用防盗链的方式
location ~* \.(gif|jpg|png|swf|flv)$ {
#这里表示Referer头域中的值是none或者blocked或者后面这些网址才会返回去正常的gif|jpg|png|swf|flv文件,否则执行下面if块代码
#上面没有匹配成功,$invalid_referer值为1,否则为0
return 404;
#防盗链
}
文件和目录不存在的时重定向
if (!-e $request_filename) {
#这里是跳转到代理ip,这个代理ip上有一个监听的web服务器
#跳转到这个网页去
#直接返回404码,然后会寻找root指定的404.html文件
}
域名跳转
server {
listen 80;
server_name aaa.cn ;
index index.html index.htm index.php;
root /var/www/html/;
#rewrite到这个地址,功能表现:在浏览器上输入aaa.cn并回车,不会有任何提示直接变成bbb.cn
}
禁止访问指定资源
location ~ ^/data { #禁止访问以/data开头的文件
deny all;
}
指定url之外的url进行rewrite跳转
允许指定域名访问本站,其他域名一律跳转