文章目录
一:Nginx Rewrite概述
1.1:案例前置知识点
- Rewrite跳转场景Rewrite跳转场景主要包括以下几种:
- 可以调整用户浏览的URL,2. 看起来更规范,3. 合乎开发及产品人员的需求。
- 为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
- 网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的360buy.com会跳转到jd.com。
- 根据特殊变量、目录、客户端的信息进行URL调整等。
1.2:Rewrite跳转实现
- Nginx是通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但不支持else。
- 另外该模块需要PCRE支持,应在编译Nginx时指定PCRE 支持,默认已经安装。根据相关变量重定向和选择不同的配置,从一个location跳转到另一个location,不过这样的循环最多可以执行10次,超过后Nginx将返回500错误。同时,重写模块包含set指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、传递参数到其他location、记录做了什么等等。
- rewrite功能就是,使用Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。
1.3:Rewrite实际场景
- 在实际工作场景,Nginx跳转需求有三种方式可实现。
- 直接用rewrite进行匹配跳转
- 使用if 匹配全局变量后跳转
- 使用location匹配再跳转
- rewrite只能放在server{},if{},location{}段中
- location只能对域名后边的除去传递的参数外的字符串起作用,例http://www.domain.com/index.php?id=1只对/index.php重写。
- 对域名或参数字符串
- 使用if全局变量匹配
- 使用proxy_pass反向代理
1.4:常用的正则表达式元字符
1.5:Rewrite 语法
-
Rewrite命令的语法如下所示:
rewrite [flag];
regex:正则
replacement:跳转后的内容
flag: rewrite支持的flag标记 -
flag标记说明:
last:相当于Apache的[L]标记,表示完成 rewrite。
break:本条规则匹配完成即终止,不再匹配后面的任何规则。
redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url(因为是临时)。
permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url。 -
如果后面不跟flag标记,那么默认是302临时重定向。在实际工作场景中,还有另一种return指定。因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。last和break区别有点难以理解。
-
last一般写在server和if中,而break一般使用在location中。last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
1.6:Location分类
- location大致可以分为三类:
- location = patt {} [精准匹配]
- location patt {} [一般匹配]
- location ~ patt {} [正则匹配]
- 精准匹配和一般匹配不需要做详细的说明,主要是正则匹配,下面就是正则匹配的一些表达式,需要多加牢记
- ~ 表示执行一个正则匹配,区分大小写。
- ~* 表示执行一个正则匹配,不区分大小写。
- !~ 表示执行一个正则匹配,区分大小写不匹配
- !~* 表示执行一个正则匹配,不区分大小写不匹配。
- ^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location。
- = 进行曾通字符精确匹配。也就是完全匹配。
- @ 它定义一个命名的location,使用在内部定向时,例如error_page
1.7:Location优先级
- 在Nginx的location和配置中location的顺序没有太大关系。和location表达式的类型
有关,相同类型的表达式,字符串长的会优先匹配。
以下是按优先级排列说明:
- 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
- ~类型表达式。一旦匹配成功,则不再查找其他匹配项。
- 正则表达式类型(和*)的优先级次之。
- 常规字符串匹配类型。按前缀匹配。
- 通用匹配(/),如果没有其它匹配,任何请求都会匹配到。
- 从功能看rewrite和location似乎有点像,都能实现跳转,主要区别在于rewrite是在同
一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,还可以
proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:
- 执行server块里面的rewrite指令。
- 执行location匹配。
- 执行选定的location中的rewrite指令。
二:实验操作
2.1:环境要求
- 在真机windows10中做一下hosts映射,将虚拟机对应的地址对应www.51xit.top和www.52xit.top
2.2:实验一
基于域名的跳转,现在公司旧域名www.51xit.top有业务需求的变更,需要使用新域名www.52xit.top代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数不变
vi /usr/local/nginx/conf/nginx.conf
找到文档中的这一段
location / {
# root html;
# index index.html index.htm;
if ($host = 'www.51xit.top'){
rewrite ^/(.*)$ http://www.52xit.top/$1 permanent;
}
}
if ($host = 'www.51xit.top'){
rewrite ^/(.*)$ http://www.52xit.top/$1 permanent;
}
systemctl restart nginx.service
然后用谷歌测试一下,在谷歌中输入www.51xit.top,他会跳转到www.52xit.top
2.3:实验二
基于客户段ip访问跳转,例如今天公司的业务版本上线,所有的ip访问任何内容都显示一个固定的维护页面,只有公司ip访问正常
vi /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.51xit.top; 改一下域名
charset utf-8; 改字符集
access_log /usr/local/nginx/logs/www.51xit.top.access.log; 改日志储存路径,去掉mail
# set $rewrite true;
# if ($remote_addr = '20.0.0.12'){ 客户机真机的位置
# set $rewrite false;
# }
# if ($rewrite = true){
# rewrite (.+) /wh.html; 跳转到wh.html 页面
# }
# location = /wh.html {
# root /usr/local/nginx/html/; wh.html存放的路径
# }
systemctl restart nginx.service
cd /usr/local/nginx/html/
cp index.html wh.html
vi wh.html 进去编辑个测试页
- 最后在谷歌中输入20.0.0.12,页面显示维护中,如果想实现另外的功能,在开一台虚拟机测试
2.4:实验三
基于旧域名跳转到新域名后面加目录,例如现在访问的是http://ww.51xit.top/post/,
现在需要将这个域名下面的发帖都跳转到http://www.52xit.top/bbs,注意保持域名跳转
后的参数不变。
vi /usr/local/nginx/conf/nginx.conf
# location /post {
# rewrite (.+) http://www.52xit.top/bbs$1 permanent;
#}
systemctl restart nginx.service
最后用谷歌输入http://ww.51xit.top/post 页面显示http://www.52xit.top/bbs
2.5:实验四
基于参数匹配的跳转,例如现在访问
http://www.51xit.top/100-(100[200)-100.html跳转到http://www.51xit.top页面。
vi /usr/local/nginx/conf/nginx.conf
if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
# rewrite (.*) http://www.52xit.top permanent;
#}
systemctl restart nginx.service
最后在谷歌中输入systemctl restart nginx.service 页面显示http://www.51xit.top
2.6:实验五
基于目录下所有php结尾的文件跳转,访问http://www.51xit.top/upload/1.php
跳转到首页
vi /usr/local/nginx/conf/nginx.conf
# location ~* /upload/.*\.php$ {
# rewrite (.*) http://www.51xit.top permanent;
#}
systemctl restart nginx.service
最后在谷歌中输入http://www.51xit.top/upload/1.php 页面显示www.51xit.top
2.7:实验六
基于最普通一条url请求的跳转,访问一个具体的页面跳转到首页
vi /usr/local/nginx/conf/nginx.conf
location ~* ^/1/test.html {
rewrite (.*) http://www.51xit.top permanent;
}
systemctl restart nginx.service
谷歌中输入http://www.51xit.top/upload/1.php 页面显示www.51xit.top