目录
rewrite跳转
rewrite跳转场景
URL看起来更规范,合理
企业会将动态URL地址伪装成静态地址提供服务
网址换新域名后,让旧的访问跳转到新的域名上
服务端某些业务调整
rewrite跳转实现图
-
rewrite实际场景
使用rewrite跳转需求的实现方式
(1)使用rewrite进行匹配跳转 实现跳转的模块
(2)使用if匹配全局变量后跳转 实现跳转的条件
(3)使用location匹配再跳转 匹配URL后跳转的条件
rewrite放在server{},if{},location{}段中
server {
location {
if{
rewrite
}
}
}
location只对域名后边的除去传递参数外的字符串起作用
对域名或参数字符串
(1)使用if全局比那辆匹配
(2)使用proxy_pass反向代理
反向代理
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
和rewrite的区别:
proxy可以进行不同节点间的跳转
rewrite进行同一个节点间的跳转
Nginx正则表达式
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符零次或多次
+ 匹配前面的字符一次或多次
? 匹配前面的字符零次或一次
. 匹配除“\n"之外的任何单个字符
\ 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用
\d 匹配纯数字
{n} 重复n次
{n,} 重复n次或更多次
[c] 匹配单个字符c
[a-z] 匹配a-z小写字母的任意一个
[a-zA-Z] 匹配a-z小写字母或A-Z大写字母的任意一个
() 表达式的开始和结束位置 例如:(jpg|gif|swf)
| 或运算符
rewrite命令
rewrite <regx> <replacement> [flag];
regx:表示使用的正则表达式
<replacement>:跳转后的内容
[ag]:rewrite支持的flag标记
last:本条重写规则匹配完成后,终止匹配后续重写规则,并重新发起请求继续匹配新的location URI规则;浏览器地址栏URL地址不变
break:本条重写规则匹配完成后,终止匹配后续重写规则; 浏览器地址栏URL地址不变
redirect:返回302临时重定向,浏览器地址会显示重写后的URL地址
permanent:返回301永久重定向,浏览器地址会显示重写后的URL地址
Nginx优先级规则
分类:
location = patt {}[精确匹配]
location patt {} [一般匹配]
location ~ patt{}[正则匹配]
由上向下匹配
~ 正则匹配的常用表达式
~* 执行一个正则匹配,区分大小写执行一个正则匹配,不区分大小写
!~ 执行一个正则匹配,区分大小写不匹配
!~* 执行一个正则匹配,不区分大小写不匹配
^~ 普通字符匹配;使用前缀匹配。如果匹配成功,则不再匹配其他location普通字符
= 精确匹配。也就是完全匹配
@ 定义一个命名的location,使用在内部定向时
location优先级
相同类型的表达式,字符串长的会优先匹配即字符串越长越精确
按优先级排列
=类型 精确匹配
~类型表达式 普通字符,匹配前缀
正则表达式(~和~*)类型 ~区分大小写~*不区分(考虑匹配的对象是文件还是目录)
常规字符串匹配类型,按前缀匹配
通用匹配(/) ,如果没有其它匹配,任何请求都会匹配到
比较rewrite和location
相同点
都能实现跳转
不同点
rewrite是在同一域名内更改获取资源的路径
location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器
rewrite会写在location里,执行顺序
执行server块里面的rewrite指令
执行location匹配
执行选定的location中的rewrite指令
总结:用目录做匹配访问某个文件
(location =目录) >(location ^~目录/) >(location ~目录)>(location ~*目录)>(location
目录)> ( location/ )
优先级总结(location优先级是怎么排列的):
匹配某个具体文件
(location = 完整路径) >(location ^。完整路径) >(location ~*完整路径) >(location~完整路径)>(location完整路径)> ( location/ )
index.html
if
多种location匹配
用目录微匹配访问某个文件
(location =目录) >(location ^~目录/)>(location ~目录) >(location ~*目录) >(location目录)>(location/)
文件目录为什么只会在区不区分大小写上会有变动正则表达式:目的是为了尽量精确的匹配
文件—》尽量精确匹配,区分大小写精确、不区分更为精确
目录—》尽量精确匹配,区分大小写精确优先级更高,不区分大小写的
关于nginx配置文件
nginx配置文件中location至少出现三种
静态匹配 动态匹配 根匹配 可以再写一个自定义匹配
根匹配
#第一个必选规则
直接匹配网站根,通过域名访问网站首页比较频繁(www.baidu.com/),使用这个会加速处理,
比如说官网。
可以是一"个静态首页,也可以直接转发给后端"应用服务器”—》PHP 、Apache
location = / {
roothtml;
index index.html index. htm;
}
#第二个必选规则是处理静态文件请求
这是nginx作为http服务器的强项(1、静态请求处理的
能力+高并发处理能力+资源消耗较低)
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ l static/ {
root /webroot/ staticl ;
}
location ~* \. (html Igif ljpg ljpeglpnglcssljslico)$ {
root /webroot/res/ ;
}
#☆☆☆☆第三个规则就是通用规则!比如用来转发带.php、.jsp后缀的动态请求到后端应用服务非静态文件请求就默认是动态请求(跳转/反向代理)即静态匹配
rewrite实践
1.修改配置文件
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80 ;
server_name www. kgc.com; #域名修改
#charset koi8-r;
access_log/var/log/ nginx/ www. kgc.com-access.log; #开启并对日志保存路径进行修改
location / { #在原有location 位置插入
if ($host = 'www.lnj.com' ) { #$host为rewrite全局变量,代表请求主机头字段或主机名
rewrite ^/ (.*)$http: //www.benet.com/$1 permanent;
#$1为匹配的位置变量,即域名后边得字符串,同时永久跳转
root html;
index index.html index.htm;
}
2.基于客户端ip访问跳转
vim /usr/ local/ nginx / conf/nginx.conf
server {
listen 80;
server_name www . lnj.com;
#charset koi8-r;
access_log/var/log/ nginx/www.kgc.com-access.log;
#设置是否是合法的IP标记
set $rewrite true; #设置变量$rewrite,变量形式为布尔值为true
#判断是否为合法IP
if ($remote_addr = "192.168.239.129")( #当客户端IP为192.168.226.132时,将变量值设为flase,不进行重写
set $rewrite false;
#除了合法IP,其它都是非法IP,进行重写跳转到维护页面
if ($rewrite = true){#布尔值表达式在不满足false情况下,会匹配满足true的location
rewrite (.+) /weihu.html; #重写在访问IP后边插入/weihu.html,例如192.168.226.160/weiu.html
}
location = / weihu. html {
root /var/ www / html; #页面返回/var/www / html/weihu. html的内容
location / {
roothtml;
indexindex.html index.htm;
}
思路:
(1)先对所有进入的访问请求,设置$rewrite=true的标签
(2)对访问来源为本地128的主机,重新设置标签为$rewrite=false
(3)对标签为$rewrite=true的来源主机,进行rewrite重写,指定其访问/weihu.html这个页面
(4)定义weihu . html页面所在的路径
PS:以上规则,自上而下匹配
3.基于旧域名跳转到新域名后面加目录
当访问的是http://bbs.lnj.com/post/1.html
会自动跳转到http://www.benet.com/post/1.html
创建指定目录
mkdir -p /usr/local/nginx/html/bbs/post
echo “<h1>this is 1.html<h2>”>> /usr/local/nginx/html/bbs/post/1.html
echo “192.168.239.129 bbs.lnj.com”>> /etc/hosts
server {
listen 80;
server_name bbs.kgc.com;#修改域名
#charset koi8-r;
access_log /var/log/nginx/www.benet.com-access.log; #修改日志名
#添加,旧:bbs.kgc.com/post/i.html
location /post{
rewrite (.+)http://www.benet.com/bbs$1 permanent;#这里$1为位置变量,代表/post
location / {
root html;
index index.html index.htm;
}
systemctl stop nginx.service
systemctl start nginx.service