rewrite概述
跳转场景
- URL看起来更规范、合理
- 企业会将动态URL地址伪装成静态地址提供服务
- 网址换新域名后,让旧的访问跳转到新的域名上
- 服务端某些业务调整
跳转需求的实现方式
Nginx跳转需求的实现方式:
使用rewrite进行匹配跳转
使用if匹配全局变量后跳转
使用location匹配再跳转
rewrite放在server{},if{},location{}段中
location只对域名后边的除去传递参数外的字符串起作用
对域名或参数字符串匹配
使用if全局变量匹配
使用proxy_pass反向代理
常用正则表达式
^:匹配输入字符串的起始位置
$:匹配输入字符串的结束位置
*:匹配前面的字符零次或多次
+:匹配前面的字符一次或多次
?:匹配前面的字符零次或一次
.:匹配除\n之外的任何单个字符
\:转义符
\d:匹配纯数字
{n}:重复n次
{n,}:重复n次或更多次
[c]:匹配单个字符c
[a-z]:匹配a-z小写字母的任意一个
[a-zA-Z]:匹配a-z小写字母或A-Z大写字母的任意一个
rewrite语法
rewrite [flag]
flag标记:
- last:相当于Apache的[L]标记,表示完成rewrite
- break:本条规则匹配完成即终止,不再匹配后面的任何规则
- redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url
- permanent:返回301永久重定向,浏览器地址会显示跳转后的URL地址,爬虫更新url
last和break区别
last:一般写在server和if中,不终止重写后的url匹配
break:一般使用在location中,终止重写后的url匹配
location分类
分类location = patt{} [精准匹配]
location patt {} [一般匹配]
location ~ patt {} [正则匹配]
location优先级
相同类型的表达式,字符串长的会优先匹配
按优先级排列
= 类型
^~ 类型表达式
正则表达式(和*)类型
常规字符串匹配类型,按前缀匹配
通用匹配(/),如果没有其他匹配,任何请求都会匹配到
location优先级规则
匹配某个具体文件:
(location = 完整路径)> (location ^~ 完整路径) > (location ~* 完整路径) = (location ~ 完整路径) > (location 完整路径) > (location /)
用目录做匹配访问某个文件:
(location = 目录)>(location ^~ 目录)>(location ~* 目录)=(location ~ 目录)>(location /)
rewrite和location区别
相同点:都能实现跳转
不同点:
- rewrite是在同一域名内更改获取资源的路径
- location是对一类路径控制访问或反向代理,还可以proxy_pass到其他机器
项目实例
1.基于域名的跳转
公司旧域名www.lzw.com,因业务需求,需要使用新域名www.lzwlzw.com代替
vi /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.lzw.com;
if ($host = 'www.lzw.com'){ ##添加重写
rewrite ^/(.*)$ http://www.lzwlzw.com/$1 permanent;
}
charset utf-8;
access_log logs/lzw.com.access.log main;
location / {
root html;
index index.html index.htm;
}
}
// 添加新的server
server {
listen 80;
server_name www.lzwlzw.com;
charset utf-8;
access_log /var/log/nginx/www.lzwlzw.com-access.log main;
location / {
root /usr/share/nginx/html; // 需要先创建目录和index.html
index index.html index.htm;
}
}
2.基于IP地址
因公司业务测试,所有其他IP访问公司网站都显示维护页面,只有公司IP访问正常
server {
listen 80;
server_name www.lzw.com;
set $rewrite true;
if ($remote_addr = "20.0.0.15"){
set $rewrite false;
}
if ($rewrite = true){
rewrite (.+) /index1.html;
}
charset utf-8;
access_log logs/lzw.com.access.log main;
location / {
root html;
index index.html index.htm;
}
}
使用公司IP 20.0.0.15访问
使用20.0.0.14访问
3.基于旧、新域名跳转并加目录
访问www.lzw.com/aa/a.html跳转到www.lzwlzw.com/second/aa/a.html
vi /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.lzw.com;
location /aa {
rewrite (.+) http://www.lzwlzw.com/second$1 permanent;
}
charset utf-8;
access_log logs/lzw.com.access.log main;
location / {
root html;
index index.html index.htm;
}
}
// 添加新的server
server{
listen 80;
server_name www.lzwlzw.com
charset utf-8;
access_log /var/log/nginx/lzwlzw.com.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
4.基于参数
域名后缀参数符合条件的都跳转至网站首页
server {
listen 80;
server_name www.test.com;
if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
rewrite (.*) http://www.test.com permanent;
}
charset utf-8;
access_log logs/test.com.access.log main;
}
5.基于目录下所有文件
访问www.lzw.com站点下所有目录的文件都跳转至首页
location ~* /aa/.*.html {
rewrite (.+) http://www.lzw.com;
}
访问www.lzw.com/aa/a.html跳转至首页
6.基于最普通URL
location ~* ^/aa/a.html {
rewrite (.+) http://www.lzw.com permanent;
}
访问www.lzw.com/aa/a.html时跳转至首页