文章目录
- 1.Rewrite简介
- 1.1跳转场景
- 1.2跳转支持
- 1.3跳转实现
- 2.Rewrite命令操作
- 2.1 flag标记说明
- 2.2常用正则表达式元字符
- 3.location匹配
- 3.1 location分类
- 3.2正则匹配的常用表达式
- 3.3location匹配优先级
- 4.location和rewrite区别
- 4.1执行顺序
- 5.需求实例
- 5.1基于域名的跳转
- 5.1.1实验效果
- 5.2基于客户端IP地址
- 5.2.1实验效果
- 5.3基于旧、新域名
- 5.3.1实验效果
- 5.4基于参数
- 5.4.1实验效果
- 5.5基于目录下所有文件
- 5.5.1实验效果
- 5.6基于最普通URL
- 5.6实验效果
1.Rewrite简介
1.1跳转场景
- URL看起来更规范、合理
- 企业会将动态URL地址伪装成静态地址提供服务
- 网址换新域名后,让旧的访问跳转到新的域名上
- 服务端某些业务调整
1.2跳转支持
ngx_http_rewrite_module模块的支持功能
Nginx:支持URL重写、支持if条件判断,但不支持else
跳转:循环最多可执行10次,超过后nginx将返回500错误
PCRE支持:使用正则表达式用于匹配条件
重写模块set指令:自定义变量以及引用全局变量
实现原理: rewrite使用Nginx全局变量或自己设置的变量,结合正则表达式和标志位实现URL重写以及重定向
1.3跳转实现
Nginx跳转需求的实现方式:
使用rewrite进行匹配跳转
使用if匹配全局变量后跳转
使用location匹配再跳转
rewrite放在server{},if{},location{}段中
location只对域名后边的除去传递参数外的字符串起作用
对域名或参数字符串匹配
使用if全局变量匹配
使用proxy_pass反向代理
2.Rewrite命令操作
rewrite <regex> <replacement> [flag];
ragex:正则表达式,用于匹配条件
replacement:目标,跳转后的内容
flag:rewrite支持的标记
2.1 flag标记说明
last:相当于Apache的[L]标记,表示完成rewrite
break:本条规则匹配完成即中止,不再匹配后面的任何规则
redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url
permanent:返回301永久重定向,浏览器地址会显示跳转后的URL地址,爬虫更新url
last和break比较
2.2常用正则表达式元字符
^:匹配输入字符串的起始位置
$:匹配输入字符串的结束位置
*:匹配前面的字符零次或多次
+:匹配前面的字符一次或多次
?:匹配前面的字符零次或一次
.:匹配除\n之外的任何单个字符
\:转义符
\d:匹配纯数字
{n}:重复n次
{n,}:重复n次或更多次
[c]:匹配单个字符c
[a-z]:匹配a-z小写字母的任意一个
[a-zA-Z]:匹配a-z小写字母或A-Z大写字母的任意一个
3.location匹配
3.1 location分类
location = patt {} ##精准匹配
location patt {} ##一般匹配
location ~ patt {} ##正则匹配
3.2正则匹配的常用表达式
标记 | 说明 |
~ | 执行一个正则匹配,区分大小写 |
~* | 执行一个正则匹配,不区分大小写 |
!~ | 执行一个正则匹配,区分大小写 不匹配 |
!~* | 执行一个正则匹配,不区分大小写不匹配 |
^~ | 普通字符匹配;使用前缀匹配。如果匹配成功,则不再匹配其他location |
= | 普通字符精确匹配。也就是完全匹配 |
@ | 定义一个命名的location,使用在内部定向时 |
3.3location匹配优先级
①:相同类型的表达式,字符串长的会优先匹配
②:按优先级排列1. = 类型
2. ^~类型表达式
3. 正则表达式(~和 ~*)类型
4. 常规字符串匹配类型,按前缀匹配
5. 通用匹配(/),如果没有其他匹配,任何请求都会匹配到
4.location和rewrite区别
相同点:都是先跳转
不同点:
rewrite是在同一域名内更改获取资源的路径
location是对一类路径做控制访问或反向代理,还可proxy_pass到其他机器
4.1执行顺序
- 执行server块例的rewrite指令
- 执行location匹配
- 执行选定的location中的rewrite指令
5.需求实例
5.1基于域名的跳转
公司旧域名www.aa.com,因业务需求,需要使用新域名www.bb.com代替
要求:1.不能废除旧域名。2.从旧域名跳转到新域名,保持其参数不变
旧域名主机配置
server {
listen 80;
server_name www.aa.com;
if ($host = "www.aa.com") {
rewrite ^/(.*)$ http://www.bb.com/$1 permanent;
}
charset utf-8;
access_log logs/aa.com.access.log main;
location / {
root html;
index index.html index.htm;
}
}
新域名主机配置
server {
listen 80;
server_name www.bb.com
charset utf-8;
access_log /var/log/nginx/bb.com.access.log main;
location / {
root /opt/share/nginx/html;
index index.html index.htm;
}
}
5.1.1实验效果
当打开www.aa.com时,跳转至www.bb.com,返回301永久重定向状态码
5.2基于客户端IP地址
因公司业务测试,所有其他IP访问公司网站都显示维护页面,只有公司IP访问正常
主机配置
server {
listen 80;
server_name www.aa.com;
set $rewrite true;
if ($remote_addr = "192.168.20.10") {
set $rewrite false;
}
if ($rewrite = true ) {
rewrite (.+) /error.html;
}
charset utf-8;
access_log logs/aa.com.access.log main;
location / {
root html;
index index.html index.htm error.html;
}
}
5.2.1实验效果
公司IP访问(正常访问公司网页)
其他地址访问(公司网页被重定向至维护提醒网页)
5.3基于旧、新域名
将域名www.aa.com下的所有发帖都跳转到www.bb.com/new,且域名跳转后保持参数不变
旧域名主机配置
server {
listen 80;
server_name www.aa.com;
location /first {
rewrite (.+) http://www.bb.com/second$1 permanent;
}
charset utf-8;
access_log logs/aa.com.access.log main;
location / {
root html;
index index.html index.htm ;
}
}
新域名主机配置
server {
listen 80;
server_name www.bb.com
charset utf-8;
access_log /var/log/nginx/bb.com.access.log main;
location / {
root /opt/share/nginx/html;
index index.html index.htm;
}
}
5.3.1实验效果
访问www.aa.com/first/1.html被重定向至www.bb.com/second/first/1.html,域名后参数不变,返回301重定向状态码
5.4基于参数
域名后缀参数符合条件的都跳转至网站首页
主机配置
server {
if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
rewrite (.*) http://www.aa.com permanent;
}
}
5.4.1实验效果
输入符合条件的www.aa.com/100-200-12.html域名后,跳转至首页www.aa.com
5.5基于目录下所有文件
让www.aa.com站点下所有目录的文件都跳转至首页
主机配置
server {
location ~* /first/.*.html {
rewrite (.+) http://www.aa.com;
}
}
5.5.1实验效果
访问www.aa.com的first目录下所有html文件都跳转至首页
5.6基于最普通URL
访问一个具体页面跳转到首页
主机配置
server {
location ~* ^/test/aa.html {
rewrite (.+) http://www.aa.com permanent;
}
}
5.6实验效果
当访问具体地址www.aa.com/test/aa.html时跳转至首页www.aa.com