在http模块有server,在server模块才有location,location匹配的是uri。在一个server当中有多个location,如何来确定匹配那个location
Nginx的正则表达式
^:字符串的起始位置
$:字符串的结束位置
*:匹配所有
+:匹配前面的字符一次或者多次
?:匹配前面的字符0次或者1次
.:任意单个字符
{n}:连续重复出现n次
{n,m}:连续重复出现n-m次
[a-z0-9A-Z]
[c] 匹配单个字符
():分组
|:或
location匹配分类
location /
location ~*
1、精确匹配location = /test{..}
完整的路径,一个字都不能少,也不能错
2、正则匹配 location ~/ {}
location ^~:前缀匹配,以什么为开头
~:区分大小写进行匹配
~*:不区分大小写进行匹配
!~:区分大小写取反匹配
!~*:不区分大小写取反匹配
3、location /test{}
一般匹配
location匹配一旦匹配成功,就不往下继续匹配
location匹配的优先级
location = /1.jpg{
root /data/nginx/static1;
}
location / {
root /data/nginx/static2;
}
location ~* \.(gif|jpg|jpeg)$ {
root /data/nginx/static3;
}
精确匹配优先级最高------其次是正则匹配------一般匹配/通用
location = 完整路径 > location ^- > location ~ 和 ~* > location /test > location /
工作当中配置location的原则
1、网站首页:都是精确匹配,网站首页都是一个静态页面,匹配网站的根目录
location = / {
}
2、处理静态文件的请求:目录匹配和后缀匹配
location ^~ /static{
}
location ~*\.{html|jpg|jpeg|gif|png}${
}
3、一般规则:动态请求,把动态请求转发到后端的动态页面服务器
location / {
proxy_pass http://tomcat server;
}
Nginx的重定向
rewrite:结合了Nginx提供的全局变量和自定义的变量,结合正则表达式以及标志位实现URL重写以及重定向
rewrite执行顺序
1、执行server块里面的rewrite
2、执行location里面定义的rewrite
3、选定location中的rewrite
rewrite中可以if语句,只有if没有else
rewrite语法
rewrite <regex> <replacemnet> [flag]
<regex> 正则表达式
<replacemnet> 跳转的内容或者路径
[ flag ] 标志位 “标记”
flag
flag
last 本条规则匹配完成后,继续向下匹配新的location uri规则
break 本条规则匹配完之后立刻终止,页面内容会变,uri不变
redirect 临时重定向302 uri的地址会发生变化
permanent 永久重定向 301 uri的地址会发生变化
location / {
rewrite /test/(.*) /zyg/$1 permanent;
index index.hyml;
}
.* 匹配所有
$1 表示捕获组$1引用正则表示式的第一个捕获组
搜索引擎的权重
永久重定向会加入搜索引擎额排名
临时不会加搜索引擎的权重
break 跳转,跳转的时候不会改变uri,用的比较多
last 继续匹配
internal redirecttion cycle while processing
处理请求时发生了重写或者内部重定向循环,进入无限循环,Nginx循环最多可以执行10次,超过10次,会报错 500
总结:rewrite和location都可以跳转,似乎有点相同,但是区别在于rewrite是在同一域名之内更改获取资源的路径
location是对路径访问控制
实验
给予域名的跳转
www.kgc.com 但是公司业务变更,迁移到了新的域名www.benet.com代替,但是旧域名不能被废除。
访问kgc可以跳转到benet且匹配的uri不变
location / {
if ($host = 'www.kgc.com') {
rewrite ^/(.*)$ http://www.benet.com/$1 permanet;
}
root html;
index index.html index.htm;
}
echo 20.0.0.* www.kgc.com www.bennet.com >> /etc/hosts
基于ip访问跳转
公司业务新版本上线,用户访问网站统一显示固定的维护页面
只有公司的20.0.0.10可以访问
set $rewrite true;
#设置是否合法的IP标记
if ($remote_addr = "20.0.0.10"){
#定义客户端的访问地址
set $rewrite false;
}
if ($rewrite = ture){
rewrite (.+) /error.html;
#(.+)任意单个字符出现一次或多次(所有非20.0.0.50)
#20.0.0.40/error.html
}
location = /error.html {
root html;
}
location / {
root html;
index index.html index.htm;
}
#注释掉error块
基于结尾文件(目录下.php访问)就会跳转到新的页面
location ~* /upload/.*\.php$ {
rewrite (.+) http://www.test.com permanent;
}
在虚拟里面测试
总结
location 匹配写法
location = /
精确匹配,完全匹配 优先级最高
location ^~
location ~*
第二优先级
location /test
第三优先级
location /
第四优先级
location是访问控制,匹配到之后不再向下继续匹配
网站的设置location规则
1、精确匹配,主要是为了匹配首页
2、location ^~ location ~*进行指定内容匹配
3、location / 主要是为了做反向代理,把动态请求转发给后端服务器
重定向 rewrite
permanent 永久重定向
redirect 临时重定向
break 跳转,跳转之后不会继续向下匹配,不改变uri
last 继续跳转,last结尾要break如不加则报错500 Nginx只能循环10次