引言

      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” 用来 判断 文件 是否 可执行。 部分 正 则 表达式 可以 在 圆括号“()” 内, 其 值 可以 通过

举例如下

nginx 在script脚本文件后面补充随机数 nginx replace指令_html

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跳转

nginx 在script脚本文件后面补充随机数 nginx replace指令_字符串_02

允许指定域名访问本站,其他域名一律跳转

nginx 在script脚本文件后面补充随机数 nginx replace指令_重定向_03