目录
3.2 rewrite 放在 server{},if{},location{} 段中
前言
现在 Nginx 已经成为很多公司作为前端反向代理 (proxy pass) 服务器的首选,在实际工作中往往会遇到很多跳转(重写URL)的需求。比如,更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。如果在后端使用的Apache服务器,虽然也能做跳转,规则库也很强大,但是用 Nginx 跳转效率会更高。
一、Nginx Rewrite概述
1. Rewrite 跳转场景
(1)调整用户浏览的 URL,看起来更规范,合乎开发及产品人员的需求。
(2)为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
(3)网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的 360buy.com 会跳转到 jd.com。
(4)服务端某些业务调整,比如根据特殊变量、目录、客户端的信息进行 URL 调整等。
2. Rewrite 跳转实现
(1)Nginx 是通过 ngx_http_rewrite_module 模块支持 url 重写、支持 if 条件判断,但不支持 else
(2)该模块需要PCRE 支持,应在编译 Nginx 时指定 PCRE 支持,默认已经安装。根据相关变量重定向和选择不同的配置,从一个location跳转到另一个location,不过这样的循环最多可以执行10次,超过后 Nginx 将返回500错误。
(3)重写模块包含 set 指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、传递参数到其他 location、记录做了什么等等。
(4)rewrite 功能就是,使用 Nginx 提供的全局变量或自己设置的变量,结合正则表达式和标志位实现 URL 的重写以及重定向。
3. Rewrite 实际场景
3.1 Nginx 跳转需求的实现方式
使用 rewrite 进行匹配跳转
使用 if 匹配全局变量后跳转
使用 location 匹配再跳转
3.2 rewrite 放在 server{},if{},location{} 段中
location 只对域名后边的除去传递参数外的字符串起作用——页面文件的路径
3.3 对域名或参数字符串
使用 if 全局变量匹配
使用 proxy_pass 反向代理
二、Nginx 正则表达式
1. 常见的正则表达式元字符
字符 | 说明 |
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或多次 |
+ | 匹配前面的字符一次或多次 |
? | 匹配前面的字符零次或一次 |
. | 匹配除”\n”之外的任何单个字符 |
\ | 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用 |
\d | 匹配纯数字 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
[c] | 匹配单个字符c |
[a-z] | 匹配a-z小写字母的任意一个 |
[a-zA-Z] | 匹配a-z小写字母或A-Z大写字母的任意一个 |
2. nginx 与 apache 区别
正则表达式是二者的区别之一
正则表达式:可以更加精确的匹配需求的字符串/参数/位置等
三、Rewrite 命令详解
1. 语法格式
rewrite <regex> <replacement> [flag];
#<regex>:正则表达式
#<replacement>:跳转后的内容
#[flag] : rewrite支持的flag标记
2. 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余下的语句,完成本次请求,地址栏不变
总的来说:last 和 break 再重定向后,地址栏都不会发生变化,这是他们的相同点。不同点在于 last 会写在 server 和 if中,break 是写在location 中,last 不会终止重写后的 url 匹配,break 会终止重写后的 url 匹配。
四、location 解析
1. location 分类
location = patt {} [精准匹配] #精确匹配字符串
location patt {} [一般匹配] #只要包含patt的字符串即可
location ~ patt {} [正则匹配] #按照正则表达式的方式匹配
2. 正则匹配的常用表达式
标记 | 说明 |
~ | 执 |