‘牡’丹江市人事局:nginx location(配置)

admin 4个月前 (05-09) 科技 54 1

Sunbet

Sunbet www.hebxs0451.com sunbet源于菲律宾Sunbet『公司』打造“的”娱乐网站。sunbet稳定、有保障“的”娱乐休闲方式让您满意!

,

<编写本文时>,【使用“的”】nginx‘版本『为』’nginx/1.17.9和nginx/1.16.1

【路由匹】配规则

location【路由】匹配“的”大致规则:location [=|^~|~|~*|@] path { ... }

“『如果』大家对这块”内容比较熟悉了,(可以直接到)优先级疑惑点这里看一个比较奇怪“的”匹配逻辑。

<精确>匹配(=)

location‘「「配置」“的”」’path和客户端‘『请』求’“的”path完全《一致》时《匹》配成功。
《匹》配成功后,nginx就会停止搜索其他匹配‘项’。

server {
  listen 2020;

  location = /test {
    return 200 '=';
  }
}
  • ‘『请』求’localhost:2020/test,《匹》配成功,‘ 响[应内容『为』’"="
  • ‘『请』求’localhost:2020/test?num=1,《匹》配成功,‘ 响[应内容『为』’"="
  • ‘『请』求’localhost:2020/test/,‘《匹配失败》’,『「【响应】状」态码』404
  • ‘『请』求’localhost:2020/test/1,‘《匹配失败》’,『「【响应】状」态码』404

{前缀匹}配(^~)

location‘「「配置」“的”」’path『为』客户端‘『请』求’“的”path前缀时《匹》配成功。
《匹》配成功后,nginx还会判断“是”否存在后面这种情况{(location『『‘修饰符’』『为』』^~ || location没有『‘修饰符’』) && location‘「「配置」“的”」’path“是”客户端‘『请』求’“的”前缀},『如果』存在,就使用匹配‘项’最多“的”作『为』最后“的”匹配结果。

server {
  listen 2020;

  location ^~ /test {
    return 200 '^~';
  }
}
  • ‘『请』求’localhost:2020/test,《匹》配成功, 响[应内容"^~"
  • ‘『请』求’localhost:2020/test/1,《匹》配成功, 响[应内容"^~"
  • ‘『请』求’localhost:2020/test111,《匹》配成功, 响[应内容"^~"
  • ‘『请』求’localhost:2020/tes,‘《匹配失败》’,『「【响应】状」态码』404
server {
  listen 2020;

  location ^~ /test {
    return 200 '/test';
  }

  location ^~ /test/1 {
    return 200 '/test/1';
  }
}
  • ‘『请』求’localhost:2020/test,《匹》配成功, 响[应内容"/test"
  • ‘『请』求’localhost:2020/tes,《匹》配成功, 响[应内容"/test"
  • ‘『请』求’localhost:2020/test/1,《匹》配成功, 响[应内容"/test/1"。这里两个location「配置」都匹配『上』了,第一个location匹配‘项’『为』1,“第二个”location匹配‘项’『为』2,由于nginx选用匹配‘项’最多“的”location,所以 响[应内容"/test/1"。

“正则匹配”(~ 和 ~*)

『‘修饰符’』~,“正则匹配”区分大小写。『‘修饰符’』~*,“正则匹配”不区分大小写。
“正则匹配”以location《在文‘件’中“的”定义顺》序从『上』到下进行匹配。《匹》配成功以后,nginx就停止搜索其他匹配‘项’。

“<注>意”:mac os文‘件’系统大小写不敏感,「因」此nginx服务‘「「配置」“的”」’location path不区分大小写,nginx使用效果“是”一样“的”。linux文‘件’系统大小写敏感,「因」此nginx〖服务区分大小写〗,nginx使用效果与前面介绍“的”效果《一致》。

~《(例子)》

server {
  listen 2020;

  location ~ /test_a {
    return 200 '~';
  }
}
  • ‘『请』求’localhost:2020/test_a,《匹》配成功, 响[应内容"~"
  • ‘『请』求’localhost:2020/test_A,《匹》配成功和失败都有可能,得看nginx服务所在“的”系统对于大‘小写“是”否敏感’。mac os系统下,《匹》配成功, 响[应内容"~";linux系统下,‘《匹配失败》’,『「【响应】状」态码』404。

~*《(例子)》

server {
  listen 2020;

  location ~* /test_a {
    return 200 '~*';
  }
}
  • ‘『请』求’localhost:2020/test_a,《匹》配成功, 响[应内容"~*"
  • ‘『请』求’localhost:2020/test_A,《匹》配成功, 响[应内容"~*"

优先级

<注>:优先级从『上』到下依次递减。

  1. <精确>匹配(=)
  2. {前缀匹}配(^~)
  3. “正则匹配”(~和~*)
  4. 通配符路径(没有任何『‘修饰符’』,只有一个通配符路径"/")

下面我们使用不同“的”location‘「配置」组合来匹配’location:2020/test_a这个‘『请』求’。

server {
  listen 2020;

  location ^~ /test_a {
    return 200 '^~';
  }

  location = /test_a {
    return 200 '=';
  }
}
  • ‘『请』求’localhost:2020/test_a,《匹》配成功, 响[应内容"=",<精确>匹配优先级比{前缀匹}配优先级大
server {
  listen 2020;

  location ~ /test_a {
    return 200 '~';
  }

  location ^~ /test_a {
    return 200 '^~';
  }
}
  • ‘『请』求’localhost:2020/test_a,《匹》配成功, 响[应内容"^~",{前缀匹}配优先级比“正则匹配”优先级大
server {
  listen 2020;
  
  location / {
    return 200 '/';
  }

  location ~ /test_a {
    return 200 '~';
  }
}
  • ‘『请』求’localhost:2020/test_a,《匹》配成功, 响[应内容"~",“正则匹配”优先级比通配符优先级大

优先级疑惑点

server {
  listen 2020;

  location ^~ /test {
    return 200 '~';
  }
  
  location /test/a {
    return 200 'null';
  }
}
  • ‘『请』求’localhost:2020/test/a,《匹》配成功, 响[应内容"null",可以知道“第二个”location「配置」优先级比前缀优先级大,这个在前面{前缀匹}配有介绍。

我们将「配置」改成下面这“个内容”:

server {
  listen 2020;
  
  location /test {
    return 200 'null';
  }

  location ^~ /test {
    return 200 '~';
  }
}

{然后运行} nginx -t来检测「配置」文‘件’“是”否正确,得到“的”结果“是”:nginx: [emerg] duplicate location "/test" in ...,【这里“的”意】思“是”路径『为』/test“的”location〖重复了〗。{看到这里},「原本以『为』」"^~"“是”nginx定义location时默认“的”『‘修饰符’』,但“是”,实际可能并不“是”,我们看下面“的”《(例子)》。

server {
  listen 2020;
  
  location ~ /test {
    return 200 '~';
  }
  
  location /test/a {
    return 200 'null';
  }

  location ^~ /test {
    return 200 '~';
  }
}
  • ‘『请』求’localhost:2020/test/a,《匹》配成功, 响[应内容"~"(what?『为』什么返回“的”不“是”"null"), 这里三个都匹配『上』了[,但“是”nginx选用“的”“是”“正则匹配”结果,这个我不知道“是”什么原因,『如果』有大佬知道原因,还请大佬帮忙解惑。

location常用“的”参数

root & alias

两个参数都“是”用来指定文‘件’路径。

<注>:‘之前很多文章’都表示alias‘「「配置」“的”」’路径最后必须加『上』"/",《这个到现在已经》不适用了。我测试“的”时候,alias‘「「配置」“的”」’路径最后不添加"/",{一样可}以正常使用。

“最终指向“的”文‘件’”路径区别

  • root指向“的”文‘件’实际路径:root+location
  • alias指向“的”文‘件’实际路径:alias
server {
  listen 2020;
  
  location /test {
    root /data;
  }
}

最终指向“的”文‘件’路径『为』/data/test

server {
  listen 2020;
  
  location /test {
    alias /data;
  }
}

最终指向“的”文‘件’路径『为』/data;

使用『上』面“的”「配置」,我们发起‘『请』求’localhost:2020/test/1.png

  • root「配置」,该‘『请』求’查找“的”文‘件’路径『为』/data/test/1.png
  • alias「配置」,该‘『请』求’查找“的”文‘件’路径『为』/data/1.png

定义位置区别

  • root“可以在”http、server、location、if『中定义』内容
  • alias<只能在>location『中定义』

root在http、server定义以后,location会默认继承『上』层定义“的”内容,“可以在”location 中使[用root对『上』层root『定』义进行重写,{或}者使用alias让『上』层root在该lcation中失效。

“正则匹配”时定义区别

  • root:(按照)前面说“的”方式使用
  • alias:需要将“正则匹配”“的”内容「添加到」alias定义“的”路径后面,具体“的”《(例子)》如下
server {
  listen 2020;
  
  location ~ /test {
    alias /data;
  }
}

‘『请』求’localhost:2020/test/1.png,《匹》配成功,但“是”没有找到文‘件’内容,【响应】404

server {
  listen 2020;
  
  location ~ /test(.*)$ {
    alias /data$1;
  }
}

‘『请』求’localhost:2020/test/1.png,《匹》配成功, 能够正常返回文‘件’[

proxy_pass

该参数用作反向代理,可以用来做负载均衡、前端解决跨域等功能。使用结构proxy_pass url

关于proxy_pass「实现负载均」衡,“可以在”nginx负载均衡中看到相关内容。

proxy_pass转发‘『请』求’,‘「「配置」“的”」’url最后“是”否有"/",会呈现不同“的”效果。

server {
  listen 2020;
  
  location /api/ {
    proxy_pass http://localhost:7001;
  }
}

‘『请』求’localhost:2020/api/component/list,nginx会将该‘『请』求’代理转发到http://locahost:7001/api/component/list
应用场景:前端‘『请』求’存在跨域,后端接口格式“是”api/‘业’务路由,前端‘『请』求’“的”接口也“是”api/‘业’务路由

server {
  listen 2020;
  
  location /api/ {
    proxy_pass http://localhost:7001/;
  }
}

‘『请』求’localhost:2020/api/component/list,nginx会将该‘『请』求’代理转发到http://locahost:7001/component/list
应用场景:后端接口格式“是”‘业’务路由,前端‘『请』求’“的”接口“是”api/‘业’务路由,前端‘『请』求’“的”接口前面加一个"api"“是”『为』了『标识』某个后端服务,(后端接口中并没)用这个『标识』。

server {
  listen 2020;
  
  location /api/ {
    proxy_pass http://localhost:7001/online;
  }
}

‘『请』求’localhost:2020/api/component/list,nginx会将该‘『请』求’代理转发到http://locahost:7001/onlinecomponent/list
应用场景:《没遇到这》样“的”场景,一般都会用都会用"/"隔开路径。

server {
  listen 2020;
  
  location /api/ {
    proxy_pass http://localhost:7001/online/;
  }
}

‘『请』求’localhost:2020/api/component/list,nginx会将该‘『请』求’代理转发到http://locahost:7001/online/component/list

rewrite

rewrite参数用来将客户端‘『请』求’<重>定向到一个新“的”地「址」。使用格式rewrite regex replacement [flag];

  • regex(<必填>):“正则匹配”,只有正则《匹》配成功后,才能进行地「址」修改等后续步骤
  • replacement(<必填>):新“的”url(以http:// https:// $schema等开头){或}者uri,正则《匹》配成功后会用这个值替换原来“的”‘『请』求’地「址」。“ 当[”replacement值“是”url时,客户端‘『请』求’发生重定向,「因」此会有两次‘『请』求’,第一次‘『请』求’“是”客户端原‘『请』求’,【响应】“的”状态码『为』302,第二次‘『请』求’“的”地「址」就“是”replacement值,本次rewrite(逻)辑运行完成以后,“《后续“的”》”rewrite(不再匹)配;“ 当[”replacement值『为』uri时,客户端‘『请』求’可能发生重定向,“是”否发生重定向与flag{参数有关}
  • flag(“可选”)
    • break:本条rewrite(逻)辑运行完成以后,“《后续“的”》”rewrite(不再匹)配
    • last:本条rewrite(逻)辑运行完成以后,“《后续“的”》”rewrite(不再匹)配,重新开始location“路由”匹配
    • permanent:永久重定向,301
    • redirect:临时重定向,302

下面展示几个《(例子)》:

server {
  listen 2020;
  
  location / {
    rewrite /(.*) https://www.$1.com;
  }
}

‘『请』求’localhost:2020/baidu,‘『请』求’被重定向到https://www.baidu.com

server {
  listen 2020;
  
  location / {
    rewrite (.*) https://www.baidu.com;
    rewrite (.*) https://www.github.com;
  }
}

‘『请』求’localhost:2020,‘『请』求’被重定向到https://www.baidu.com,【查】看network,里面有一条http://localhost:2020/‘『请』求’,【响应】“的”状态码『为』302,还以一条https://www.baidu.com/‘『请』求’。

server {
  listen 2020;
  
  location / {
    rewrite (.*) /test redirect; # permanent也“是”可以“的”
  }
  
  location /test {
    return 200 'ok';
  }
}

‘『请』求’localhost:2020,‘『请』求’被重定向到http://localhost:2020/test,network中有两条‘『请』求’分别“是”『「【响应】状」态码』302(flag值『为』permanent时,状态码『为』301)“的”http://localhost:2020/‘『请』求’和『「【响应】状」态码』『为』200“的”http://localhost:2020/test‘『请』求’。

flag值『为』break{或}last都会终止后续rewrite匹配((不)会终止proxy_pass等逻辑),两者不同“的”点“是”,break不会发起一轮新“的”location“路由”匹配,而last会发起一轮新“的”location匹配。

server {
  listen 2020;
  
  location /last {
    rewrite /last(.*) /test1;
    rewrite /test1(.*) /test2 last;
    rewrite /test2(.*) /test3;
  }
  
  location /break {
    rewrite /break(.*) /test1;
    rewrite /test1(.*) /test2 break;
    rewrite /test2(.*) /test3;
  }

  location /test1 {
    return 200 'test1';
  }

  location /test2 {
    return 200 'test2';
  }

  location /test3 {
    return 200 'test3';
  }
}
  • ‘『请』求’localhost:2020/last, 响[应内容"test2"。这个‘『请』求’被location /last {...}《匹》配成功,因『为』rewrite /test1(.*) /test2 last这里flag『为』last,{ 所以这条[}rewrite(逻)辑运行完以后,就会忽略“《后续“的”》”rewrite,“然后重新”location“路由”匹配,重新匹配时‘『请』求’变成http://localhost:2020/test2,「因」此会被location /test2 {}这条location匹配,所以‘ 响[应内容『为』’"test2"。
  • ‘『请』求’localhost:2020/break,『「【响应】状」态码』『为』404。这个‘『请』求’被location /break {...}《匹》配成功,因『为』rewrite /test1(.*) /test2 break这里flag『为』break,{ 所以这条[}rewrite(逻)辑运行完以后,就会忽略“《后续“的”》”rewrite,执行完“ 当[”前location后还“是”没有找到{资源}文‘件’,「因」此返回状态码"404"。

将『上』面《(例子)》中location /break {...}{这部分内容}修改一下,修改成如下内容:

location /break {
    rewrite /break(.*) /test1;
    rewrite /test1(.*) /test2 break;
    rewrite /test2(.*) /test3;
    
    proxy_pass http://localhost:2020;
}
  • ‘『请』求’localhost:2020/break, 响[应内容"test2",rewrite ‘语句’[中flag值『为』break,不会影响proxy_pass‘语句’,「因」此localhost:2020/break实际会代理转发到localhost:2020/test2这个地「址」。

『如果』rewrite部分内容没有看懂,可以到搞懂nginx“的”rewrite模块【查】看更详细“的”介绍。

index

index用于指定网站“的”起始页面,默认值index index.html;

index参数只“是”用来指定文‘件’“的”路径,nginx“根据”index参数查找文‘件’“是”否存在,『如果』存在就用文‘件’路径拼接成新“的”url,nginx内部重定向到这个新“的”url, 来获取到起始页[面{资源}。下面用具体“的”《(例子)》来进「行说明」(/data/test 目录下有一[个index.html文‘件’):

server {
  listen 2020;
  
  location / {
    root /data/test;
    index index.html;
  }
}

‘『请』求’localhost:2020,‘ 响[应内容『为』’文‘件’/data/test/index.html内容。

下面对「配置」文‘件’添加一些内容,用来匹配html文‘件’‘『请』求’:

server {
  listen 2020;
  
  location / {
    root /data/test;
    index index.html;
  }
  
  location ~ \.html$ {
    return 200 'html文‘件’‘『请』求’拦截';
  }
}

‘『请』求’localhost:2020, 响[应内容"html文‘件’‘『请』求’拦截"。这个《(例子)》很好“的”说明nginx内部会将初始页文‘件’路径生成一个新“的”url,nginx内部重定向到这个新“的”url‘『请』求’初始页文‘件’。

index后面可以跟多个文‘件’路径,“ 当[”前一个文‘件’不存在时,nginx会自动判断后面文‘件’“是”否存在。下面使用一个《(例子)》来展示(/data/test{目录下只有}idnex.php文‘件’):

server {
  listen 2020;
  
  location / {
    root /data/test;
    index index.html index.php;
  }
}

‘『请』求’localhost:2020,nginx会首先判断文‘件’/data/test/index.html“是”否存在,『如果』存在,就使用这个文‘件’路径来生成新“的”文‘件’url,然后nginx内部重定向到这个文‘件’{资源};『如果』不存在,【就判】断/data/test/index.php文‘件’“是”否存在,『如果』不存在就返回403,『如果』存在,就使用这个文‘件’路径来生成新“的”文‘件’url,然后nginx内部重定向到这个文‘件’{资源}。

欧博开户声明:该文看法仅代表作者自己,与本平台无关。转载请注明:‘牡’丹江市人事局:nginx location(配置)

网友评论

  • (*)

最新评论

  • 阳光在线app下载 2020-05-09 07:39:07 回复

    阳光在线:www.baolonglxg.com(原诚信在线)现已开放阳光在线手机版下载。阳光在线游戏公平、公开、公正,用实力赢取信誉。内容很优

    1

文章归档

站点信息

  • 文章总数:444
  • 页面总数:0
  • 分类总数:8
  • 标签总数:980
  • 评论总数:105
  • 浏览总数:2752