装修设计公司网站有哪些,厦门建设局局长李德才,郑州做网站优化价格,聚诚商务做网站多少钱Nginx的location路径匹配规则 1、 语法2、 语法说明3、匹配规则#xff08;先后顺序#xff09;4、测试示例5、【uri】正则路径5、路径替换6、location后斜杆与proxy_pass后斜杆/问题#xff0c;最好要么两者都加斜杆#xff0c;要么都不加 1、 语法
[ |~ | … Nginx的location路径匹配规则 1、 语法2、 语法说明3、匹配规则先后顺序4、测试示例5、【uri】正则路径5、路径替换6、location后斜杆与proxy_pass后斜杆/问题最好要么两者都加斜杆要么都不加 1、 语法
[ |~ | ~* | ^~ | ] /uri/ 注uri是指匹配路径 [ | ~ | ~* | ^~ | ] 是指匹配规则可选 location ^~/uri/{...}location /uri/{...}...2、 语法说明 : 完全匹配表示精确匹配后面的url^~ : 无正则普通匹配 ^ 表示“非”~ 表示“正则”字符意思是不会继续匹配正则表示普通字符匹配如果该选项匹配只匹配该选项不匹配别的选项一般用来匹配目录/ : 普通匹配/xxx~ : 表示正则匹配区分大小写~* : 表示正则匹配不区分大小写 : “” 定义一个命名的 location使用在内部定向时例如 error_page
3、匹配规则先后顺序 前缀的指令严格匹配这个查询优先级最高一旦匹配成功则停止搜索其他localtion的匹配项所有剩下的常规字符串^~和普通匹配‘最长命中’规则优先使用匹配最长的结果。正则表达式在配置文件中定义的顺序 注 ^~ 和普通匹配。使用前缀匹配不支持正则表达式如果有多个location匹配成功的话不会终止匹配过程会记忆表达式最长的那个如果得到的最长的location为 ^~ 类型则表示阻断正则表达式不再匹配正则表达式。如果得到的最长的location不是 ^~ 类型继续匹配正则表达式只要有一个正则成功则使用这个正则的location立即返回结果并结束解析过程。
(1) 最长命中 ^~ 和普通命中都是优先使用匹配最长的结果 且 ^~ 优先级并不比普通匹配高
location ^~ /a {root /;
}
location ^~ /aaa {root /aaa;
}请求url为/aaa则上面两个location都匹配成功但用于location ^~ /aaa较长所以最终会以/aaa作为root。上例中如果是普通匹配把location的 ^~ 去掉结果也是一样的
location /test_1 {return 400;
}
location ^~ /test {return 401;
}请求path为/test_1则上面两个location都匹配成功但用于location /test_1 较长,所以最终返回的是400同时也可看出^~ 优先级并不比普通匹配高
(2) 得到的最长的location为 ^~ 类型则表示阻断匹配不再继续得到的最长的location不是 ^~ 类型继续匹配
location /test_1 {return 400;
}
location ^~ /test {return 401;
}
location ~ /test {return 402;
}请求path为/test_1返回的是402此时^~和普通匹配只记住了最长一个location /test_1不会阻止正则请求path为/test返回401此时 ^~ 和普通匹配只记住了最长一个location ^~ /test会阻止正则
(3) ~ 规则匹配路径中只要包含就可以匹配同时正则匹配时放在前面的优先匹配如果不区分大小写时使用 ~*因此在书写代理时尽量将精确匹配的放在前面
location ~ /hello {
return 602;
}
location ~ /helloworld {
return 601;
}请求 localhost/world/helloworld 返回 602请求 localhost/helloworld 返回 602
location ~ /helloworld {
return 601;
}
location ~ /hello {
return 602;
}请求 localhost/world/helloworld 返回 601请求 localhost/helloworld 返回 601
4、测试示例
location /world {
return 600;
}location /hello {
return 601;
}location ~ /hellowo {
return 602;
}location ^~ /hello {
return 603;
}请求 localhost/world 返回600 是精确完整匹配且优先级最高请求 localhost/hello 返回601 是精确完整匹配且优先级最高请求 localhost/hello/123 返回603^~ 这个规则是前缀匹配和 相比范围更广故该请求会被 ^~ 这个规则匹配上但是 不会匹配请求 localhost/hellow 返回603如果 ~ 和 ^~ 同时匹配规则则 ^~ 优先请求 localhost/hellowo 返回603 如果 ~ 和 ^~ 同时匹配规则则 ^~ 优先请求 localhost/test/hellowo 返回602 ~ 路径中只要包含就可以匹配请求 localhost/test/hello 返回其他^~ 这个规则是前缀匹配不会匹配请求 url 中后面的路径故该请求没有匹配上请求 localhost/world2 localhost/test/world 返回其他
5、【uri】正则路径
这里主要填的是需要匹配的 path 路径根据前面的符号这里可以填写精确到 path 路径也可以填正则表达式下面则主要针对正则进行说明 匹配除换行符以外的任意字符? 重复0次或1次 重复1次或更多次* 重复0次或更多次\d 匹配数字^ 匹配字符串的开始$ 匹配字符串的介绍{n} 重复n次{n,} 重复n次或更多次[c] 匹配单个字符c[a-z] 匹配a-z小写字母的任意一个 注小括号()之间匹配的内容可以在后面通过$1来引用$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。
5、路径替换
配置proxy_pass时可以实现URL路径的部分替换。proxy_pass的目标地址默认不带/表示只代理域名(ip端口)path和query部分不会变把请求的path和query拼接到proxy_pass目标域名之后作为代理的URL如果在目标地址端口后有‘/’或者‘/xx/yy’等目录则表示把path中location匹配成功的部分剪切掉之后再拼接到proxy_pass目标地址后面 比如请求 /a/b.html
location /a {proxy_pass http://server;
}实际代理的目标url是http://server/a/b.html (把/a/b.html拼接到http://server之后)
location /a/ {proxy_pass http://server/;
}http://server/b.html (把/a/b.html的/a/去掉之后拼接到http://server/之后)
总结如下代理地址 第一若proxy_pass代理地址端口后无任何字符则转发后地址为代理地址访问的path表格1的1、3行端口后面没有字符转发后的地址带着location匹配的部分。 第二若proxy_pass代理地址端口后有目录包括/则转发后地址为代理地址访问的path去除location匹配的路径表格1的2、4行以及表格2都是端口后面有/或目录转发后的地址去除location匹配的部分。
6、location后斜杆与proxy_pass后斜杆/问题最好要么两者都加斜杆要么都不加
以服务地址http://127.0.0.1:5053/api/test/getById进行说明访问地址是http://127.0.0.1/api/test/getById。location后斜杆与proxy_pass后斜杆问题如下
location、proxy_pass都不加斜杠实际代理地址http://127.0.0.1:5053/api/test/getById
location /api {proxy_pass http://127.0.0.1:5053;
}location加斜杠proxy_pass不加斜杠实际代理地址http://127.0.0.1:5053/api/test/getById正确的
location /api/ {proxy_pass http://127.0.0.1:5053;
}location不加斜杠proxy_pass加斜杠实际代理地址http://127.0.0.1:5053//test/getById错误的也出现了双斜杠
location /api {proxy_pass http://127.0.0.1:5053/;
}location、proxy_pass都加斜杠实际代理地址http://127.0.0.1:5053/test/getById错误的
location /api/ {proxy_pass http://127.0.0.1:5053/;
}location不加斜杠proxy_pass加api实际代理地址http://127.0.0.1:5053/api/test/getById正确的
location /api {proxy_pass http://127.0.0.1:5053/api;
}location加斜杠proxy_pass加api实际代理地址http://127.0.0.1:5053/apitest/getById错误的少了一个斜杆
location /api/ {proxy_pass http://127.0.0.1:5053/api;
}location不加斜杠proxy_pass加api/实际代理地址http://127.0.0.1:5053/api//test/getById出现双斜杠问题后端在认证请求时会校验失败
location /api {proxy_pass http://127.0.0.1:5053/api/;
}location加斜杠proxy_pass加api/实际代理地址http://127.0.0.1:5053/api/test/getById正确的
location /api/ {proxy_pass http://127.0.0.1:5053/api/;
}