Nginx中location块配置入门
location块起到的作用是匹配客户端请求,并分配到相应服务器进行处理;所以location块可以分为两部分匹配和转发。
1.location块匹配语法
location块匹配分为三部分:location关键字+匹配模式修饰符+正则字符串。
(1)匹配模式
包括:以正则字符串开头的匹配模式、与正则字符串完全相同的匹配模式、区分大小写的匹配模式、不区分大小写的匹配模式、其他正则匹配模式等。
a)以正则字符串开头的匹配模式的修饰符:无修饰符和^~;二者的区别^~匹配到客户端请求后,不再尝试匹配其他location块。
客户端请求http://10.10.10.11/test,以下两个都能匹配到。
# location关键字、无匹配修饰符、/test:正则字符串 location /test { proxy_pass http://xxx.xxx.xxx.xxx/abc; } # location关键字、^~匹配修饰符、/test:正则字符串,客户端请求被此location匹配后,将不再匹配其他location块 location ^~ /test { proxy_pass http://xxx.xxx.xxx.xxx/abc; }
b)与正则字符串完全相同的匹配模式的修饰符:=
客户端请求http://10.10.10.11/test,以下两个只有第二个可以匹配到。
# location关键字、完全相同的匹配修饰符、/test:正则字符串 location = /test123 { proxy_pass http://xxx.xxx.xxx.xxx/abc; } location = /test { proxy_pass http://xxx.xxx.xxx.xxx/abc; }
c)区分大小写的匹配模式的修饰符:~
客户端请求http://10.10.10.11/test,以下两个只有第二个可以匹配到。
# location关键字、区分大小写的匹配模式的修饰符、/test:正则字符串 location ~ /Test { proxy_pass http://xxx.xxx.xxx.xxx/abc; } location ~ /test { proxy_pass http://xxx.xxx.xxx.xxx/abc; }
d)不区分大小写的匹配模式的修饰符:~*
客户端请求http://10.10.10.11/test,以下两个都可以匹配到。
# location关键字、不区分大小写的匹配模式的修饰符、/test:正则字符串 location ~* /Test { proxy_pass http://xxx.xxx.xxx.xxx/abc; } location ~* /test { proxy_pass http://xxx.xxx.xxx.xxx/abc; }
(2)匹配修饰符优先级
当正则字符串在不同的匹配修饰符号的作用下都可以与客户端的请求匹配时,会出现冲突情况,此时便可以根据匹配修饰符优先级别确定匹配哪个。优先级从高到底依次为:
完全相同的匹配模式修饰符(=)、无匹配修饰符的完全相同匹配模式、以正则字符串开头的匹配模式的修饰符(^~)、不区分大小写的匹配模式的修饰符(~*)和区分大小写的匹配模式的修饰符(~)、以正则字符串开头的匹配模式的无修饰符的情况。
2.location块转发语法
(1)root和alias
语法:root(alias) 待替换的路径
两个命令都是用来重新指定文件的路径,不同的是root为补充式确定文件路径,alias为替换式确定文件路径。
客户端请求http://10.10.10.11/test/10.png,以下两个都可以匹配到,但是得到的转发路径不一样。
# alias 替换式确定文件路径,root补充式替换文件路径 location /test { alias /abc/cde; } location /test { root /abc/cde }
经过alias命令得到的请求是:http://10.10.10.11/abc/cde/10.png,经过root命令得到的请求是:http://10.10.10.11/abc/cde/test/10.png
(2)proxy_pass
proxy_pass的功能与root、alias的类似,都是转发到另一个目的地,只不过proxy_pass指向proxy_url。
proxy_url有两种写法,会生成不同代理请求。
例如:客户端请求http://10.10.10.11/test/login.html。
# alias 替换式确定文件路径,root补充式替换文件路径 location /test { proxy_pass http://127.0.0.1/abc } location /test { proxy_pass http://127.0.0.1/abc/ }
第一种写法可以称之为前截断替换,从匹配字符串前面截断,前面替换为proxy_url。
代理请求为:http://127.0.0.1/abc/test/login.html;
第二种写法可以称之为后截断替换,从匹配字符串后面截断,前面替换为proxy_url。
代理请求为:http://127.0.0.1/abc/login.html;