- 一、Nginx Rewrite概述
- 1. Rewrite 跳转场景
- 2. Rewrite 跳转实现
- 3. Rewrite 实际场景
- 二、Nginx 正则表达式
- 1. 常见的正则表达式元字符
- 2. nginx 与 apache 区别
- 三、Rewrite 命令详解
- 1. 语法格式
- 2. flag 标记
- 四、location 解析
- 1. location 分类
- 2. 正则匹配的常用表达式
- 3. location 优先级
- 4. 优先级示例
- 5. rewrite 和 location 比较
- 6. location 优先级规则
一、Nginx Rewrite概述 1. Rewrite 跳转场景
- 调整用户浏览的 URL,看起来更规范,合乎开发及产品人员的需求。
- 为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
- 网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的 360buy.com 会跳转到 jd.com。
- 服务端某些业务调整,比如根据特殊变量、目录、客户端的信息进行 URL 调整等
- Nginx 是通过 ngx_http_rewrite_module 模块支持 url 重写、支持 if 条件判断,但不支持 else 。
- 该模块需要PCRE 支持,应在编译 Nginx 时指定 PCRE 支持,默认已经安装。根据相关变量重定向和选择不同的配置,从一个location跳转到另一个location,不过这样的循环最多可以执行10次,超过后 Nginx 将返回500错误。
- 同时,重写模块包含 set 指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、传递参数到其他 location、记录做了什么等等。
- rewrite 功能就是,使用 Nginx 提供的全局变量或自己设置的变量,结合正则表达式和标志位实现 URL 的重写以及重定向
① Nginx 跳转需求的实现方式
使用 rewrite 进行匹配跳转
使用 if 匹配全局变量后跳转
使用 location 匹配再跳转
② rewrite 放在 server{},if{},location{} 段中
- location 只对域名后边的除去传递参数外的字符串起作用——页面文件的路径
③ 对域名或参数字符串
二、Nginx 正则表达式 1. 常见的正则表达式元字符
- 使用 if 全局变量匹配
- 使用 proxy_pass 反向代理
| 字符 | 说明 |
|---|---|
| ^ | 匹配输入字符串的起始位置 |
| $ | 匹配输入字符串的结束位置 |
| * | 匹配前面的字符零次或多次 |
| + | 匹配前面的字符一次或多次 |
| ? | 匹配前面的字符零次或一次 |
| . | 匹配除”n”之外的任何单个字符 |
| 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用 | |
| d | 匹配纯数字 |
| {n} | 重复n次 |
| {n,} | 重复n次或更多次 |
| [c] | 匹配单个字符c |
| [a-z] | 匹配a-z小写字母的任意一个 |
| [a-zA-Z] | 匹配a-z小写字母或A-Z大写字母的任意一个 |
三、Rewrite 命令详解 1. 语法格式正则表达式是二者的区别之一
正则表达式:可以更加精确的匹配需求的字符串/参数/位置等
rewrite2. flag 标记[flag]; # :正则表达式 # :跳转后的内容 #[flag]rewrite支持的flag标记
| 标记 | 说明 |
|---|---|
| last | 相当于Apache的[L]标记,表示完成rewrite |
| break | 本条规则匹配完成即终止,不再匹配后面的任何规则 |
| redirect | 返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url |
| permanent | 返回301永久重定向,浏览器地址会显示跳转后的URL地址,爬虫更新url |
- last 和 break 比较
| last | break | |
|---|---|---|
| 使用场景 | 一般写在 server 和 if 中 | 一般使用在 location 中 |
| URL匹配 | 不终止重写后的 urI 匹配 | 终止重写后的 url 匹配 |
- last:url 重写后,马上发起一个新请求,再次进入 server 块,重试 location 匹配,超过10次匹配不到报 500 错误,地址栏不变;
- break:url重写后,直接使用当前资源,不再使用location余下的语句,完成本次请求,地址栏不变
四、location 解析 1. location 分类总的来说:last 和 break 再重定向后,地址栏都不会发生变化,这是他们的相同点。不同点在于 last 会写在 server 和 if中,break 是写在location 中,last 不会终止重写后的 url 匹配,break 会终止重写后的 url 匹配。
location = patt {} [精准匹配]
location patt {} [一般匹配]
location ~ patt {} [正则匹配]
2. 正则匹配的常用表达式
| 标记 | 说明 |
|---|---|
| ~ | 执行一个正则匹配,区分大小写 |
| ~* | 执行一个正则匹配,不区分大小写 |
| !~ | 执行一个正则匹配,区分大小写不匹配 |
| !~* | 执行一个正则匹配,不区分大小写不匹配 |
| ^~ | 普通字符匹配,使用前缀匹配,如果匹配成功,则不再匹配其他location |
| = | 普通字符精确匹配,也就是完全匹配 |
| @ | 定义一个命名的location,使用在内部定向时 |
-
相同类型的表达式,字符串长的会优先匹配
-
按优先级匹配
= 类型 ^~ 类型表达式 正则表达式(~和~*)类型 常规字符串匹配类型,按前缀匹配 通用匹配(/),如果没有其他匹配,任何请求都会匹配到4. 优先级示例
-------------------------------------------------------------------------------------------------
location = / {
[ configuration A ]
}
#精确匹配,主机名后面不能带任何字符串
-------------------------------------------------------------------------------------------------
location / {
[configuration B ]
}
#一般匹配,所有的地址都以/开头,这条规则将匹配到所有请求,但正则表达式和最长字符会优先匹配
------------------------------------------------------------------------------------------------
location /documents/ {
[ configuration C]
}
#匹配任何以/documents/开头的地址,当后面的正则表达式没有匹配到时,才起作用
------------------------------------------------------------------------------------------------
location ~ /documents/abc {
[ configuration D ]
}
#匹配任何以/documents/abc开头的地址,当后面正则表达式没有匹配到时,才起作用
------------------------------------------------------------------------------------------------
5. rewrite 和 location 比较
- 相同点:都能实现跳转
- 不同点:
① rewrite 是在同一域名内更改获取资源的路径
② location是对一类路径控制访问或反向代理,还可以 proxy_pass 到其他机器
6. location 优先级规则
- rewrite会写在location里,执行顺序
①执行server块里面的rewrite指令
②执行location匹配
③执行选定的location中的rewrite指令
- 匹配某个具体文件
(location = 完整路径)>(location ^~ 完整路径)>(location ~* 完整路径)=(location ~ 完整路径)>(location /)
- 用目录做匹配访问某个文件
(location = 目录)>(location ^~ 目录)>(location ~* 目录)=(location ~ 目录)>(location /)



