Nginx执行过程
location规则
语法规则: location [=|~|~*|^~] /uri/ {… }
符号
|
含义
|
=
|
= 开头表示精确匹配
|
^~
|
^~开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,
因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)
|
~
|
~开头表示区分大小写的正则匹配
|
~*
|
~*开头表示不区分大小写的正则匹配
|
!~和!~*
|
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则
|
/
|
用户所使用的代理(一般为浏览器)
|
1. 精确匹配和一般匹配
location = /jqybpp {
rewrite ^/ /jqpp.html break;
root /com/jit/location;
} location /jqybpp {
rewrite ^/ /ybpp.html break;
root /com/jit/location;
}
访问地址:http://localhost/jqybpp 访问地址的【/jqybpp】精确匹配到第一个规则,返回jqpp.html
访问地址:http://localhost/jqybpp.html 访问地址的【jqybpp.html 】匹配第二个规则,返回ybdpp.html
2. 一般匹配
location /ybpp {
rewrite ^/ /ybdpp.html break;
root /com/jit/location;
} location /ybpp/c {
rewrite ^/ /ybcpp.html break;
root /com/jit/location;
}
访问地址:http://localhost/ybpp访问地址的【/ybpp】匹配第一个规则,返回ybdpp.html
访问地址:http://localhost/ybpp/c 访问地址的【/ybpp/c】既与第一个规则匹配,又与第二个规则匹配,这时以最长uri匹配优先,返回ybcpp.html
3. 一般匹配与^~开头的非正则匹配
location /ybkt/ktpp/d { rewrite ^/ /ybdpp.html break; root /com/jit/location;
} location ^~ /ybkt/ktpp { rewrite ^/ /ktpp.html break; root /com/jit/location;
}
访问地址:http://localhost/ybkt/ktpp/d 访问地址的【/ybkt/ktpp/d】既与第一个规则匹配,又与第二个规则匹配,这时以一般匹配优先,返回ybdpp.html
访问地址:http://localhost/ybkt/ktpp 访问地址的【/ybkt/ktpp】匹配第二个规则,返回ktpp.html
4. ^~开头的非正则匹配与正则表达式匹配
location ~ /ktzz/ktpp/zzpp {
rewrite ^/ /zzpp1.html break;
root /com/jit/location;
}
location ^~ /ktzz/ktpp {
rewrite ^/ /ktpp.html break;
root /com/jit/location;
}
访问地址:http://localhost/ktzz/ktpp/zzpp 访问地址的【/ktzz/ktpp/zzpp】既与第一个规则匹配,又与第二个规则匹配,这时以^~优先,返回ktpp.html
5. 一般匹配与正则表达式匹配
location /ybzz/ybpp {
rewrite ^/ /ybcpp.html break;
root /com/jit/location;
}
location ~ /ybzz/ybpp/zzpp {
rewrite ^/ /zzpp.html break;
root /com/jit/location;
}
访问地址:http://localhost/ybzz/ybpp/zzpp 访问地址的【/b/d/a】匹配第二个规则,返回zzpp.html
6. 正则表达式与正则表达式
location ~ zzzz/zzpp {
rewrite ^/ /zzpp.html break;
root /com/jit/location;
} location ~ zzzz/zzpp/1 {
rewrite ^/ /zzpp1.html break;
root /com/jit/location;
}
访问地址:http://localhost/zzzz/zzpp/1 访问地址的【/zzzz/zzpp/1】匹配第一个规则,返回zzpp1.html
location规则总结:
1.带有【=】的精确匹配优先,立即返回。
2.普通匹配,如果命中多个,则记录【最长的规则】,如果存在正则表达式匹配,【由上至下开配】,一旦匹配成功【1】个,【立即返回】结果,并结束解析过程,否则返回【最长的匹配】。
3.一般匹配与^~开头的非正则匹配,一般匹配优先,但还需要考虑那个匹配最长。
4./ 为默认匹配,即如果没有匹配上其他的location,则最后匹配默认匹配的部分。
server {
listen 81; #服务端口
server_name localhost; #服务地址,多个用逗号分隔
##########精确匹配与一般匹配 ########
location = /jqybpp {
rewrite ^/ /jqpp.html break;
root /com/jit/location;
}
location /jqybpp {
rewrite ^/ /ybdpp.html break;
root /com/jit/location;
}
############ 一般匹配 #############
location /ybpp {
rewrite ^/ /ybdpp.html break;
root /com/jit/location;
}
location /ybpp/c {
rewrite ^/ /ybcpp.html break;
root /com/jit/location;
}
###########一般匹配与^~开头的非正则匹配 ######
location /ybkt/ktpp/d {
rewrite ^/ /ybdpp.html break;
root /com/jit/location;
}
location ^~ /ybkt/ktpp {
rewrite ^/ /ktpp.html break;
root /com/jit/location;
}
# location /ybkt/ktpp {
# rewrite ^/ /ybdpp.html break;
# root /com/jit/location;
# }
# location ^~ /ybkt/ktpp/zzpp {
# rewrite ^/ /ktpp.html break;
# root /com/jit/location;
# }
###########^~开头的非正则匹配与正则表达式匹配###########
location ~ /ktzz/ktpp/zzpp {
rewrite ^/ /zzpp1.html break; root /com/jit/location;
}
location ^~ /ktzz/ktpp {
rewrite ^/ /ktpp.html break;
root /com/jit/location;
}
#####一般匹配与正则表达式匹配 ######
location /ybzz/ybpp {
rewrite ^/ /ybcpp.html break;
root /com/jit/location;
}
location ~ /ybzz/ybpp/zzpp {
rewrite ^/ /zzpp.html break;
root /com/jit/location;
}
########正则表达式与正则表达式 #######
location ~ zzzz/zzpp/1 {
rewrite ^/ /zzpp1.html break;
root /com/jit/location;
}
location ~ zzzz/zzpp {
rewrite ^/ /zzpp.html break;
root /com/jit/location;
}
}
root和alias区别
root:在目录里找path1+path2路径,最后定位到的地址为: root路径+path1+path2
location / {
root /com/jit/static/html;
index jit.html; # 默认访问首页文件
}
访问:http://www.test.com:81,使用这种配置则访问到/com/jit/static/html/jit.html
alias:在目录里找path2路径,最后定位到的地址为:alias地址+path2
location /image {
alias /com/jit/static/image;
}
访问:http://www.test.com:81/image/one.jpg,使用这种配置则访问到/com/jit/static/image/one.jpg
proxy_pass详解
在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。
以下情况都访问http://www.test.com:81/proxy/proxy.html。
1. proxy_pass以【/】结尾
location /proxy1/ {
proxy_pass http://192.168.110.102:8081/;
}
代理到的url为:http://192.168.110.102:8081/proxy.html
2. proxy_pass不以【/】结尾
location /proxy2/ { proxy_pass http://192.168.110.102:8081; }
代理到的url为:http://192.168.110.102:8081/proxy1/proxy.html
3. proxy_pass存在path以【/】结尾
location /proxy3/ { proxy_pass http://192.168.110.102:8081/gateway/; }
代理到的url为:http://192.168.110.102:8081/gateway/proxy.html
4. proxy_pass存在path不以【/】结尾
location /proxy4/ { proxy_pass http://192.168.110.102:8081/gateway; }
代理到的url为:http://www.test.com:81/gatewayproxy.html
rewrite语法格式及参数语法说明如下
rewrite |
<regex> | <replacement> | [flag] |
|
|
|
|
|
|||
|
|||
|
|||
|
flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的location URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
rewrite参数的标签段位置:
server { listen 80; server_name localhost; rewrite ^/(.*) http://192.168.110.102:8081/$1 permanent; #` `$1表示路径中 正则表达式匹配的第一个参数 } }
server { listen 80; server_name localhost; if ( $host != 'www.test.com:81' ) { rewrite ^/(.*) http://192.168.110.102:8081/$1 permanent; #` `$1表 示路径中正则表达式匹配的第一个参数 } }
regex 常用正则表达式说明 :
字符
|
描述
|
**
|
将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配
一个换行符,而“$”则匹配“$”
|
^
|
匹配输入字符串的起始位置
|
$ |
匹配输入字符串的结束位置
|
*
|
匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
|
+
|
匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“oll”,但不能匹配“o
|
?
|
匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,"?"等效于"{0,1}"
|
.
|
匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
|
(pattern)
|
匹配括号内pattern并可以在后面获取对应的匹配,常用$0...$9属性获取小括号中的匹配内容,要匹配圆括号字符需要(Content)
|