指令作用

匹配指定的URI(uri指路径不包含参数和域名+端口【套接字】)

 

语法形式

官网:http://nginx.org/en/docs/http/ngx_http_core_module.html#location

Syntax:

location [ = | ~ | ~* | ^~ ] uri { ... }

location @name { ... }

Default:

Context:

server, location

 

location = /uri =表示精确前缀匹配,只有完全匹配上才生效

location /uri 不带任何修饰符前缀匹配,/pay 匹配到/pay或/pay/end或/pay/xxx

location / 匹配所有路径,因为uri都是以/开头的

location ^~ uri ^~表示只匹配普通字符串,不匹配正则表达式

location ~ pattern ~表示正则表达式匹配,不忽略大小写

location ~* pattern ~*表示正则表达式匹配,忽略大小写

location @xxx @ 是用来定义named location的可以理解为除了普通字符串、正则表达式外的第三中模式;不是用来处理普通http请求,用来处理“内部重定向”

 

匹配模式和顺序

匹配字符串分为两种:普通字符串(literal string)和正则表达式(regular expression,

其中~、~*用于正则表达式,其他前缀=、^~ 、没有前缀、@ 用于普通字符串;

 

匹配顺序: 1.先匹配普通字符串,将最准确的暂时存储起来;(普通字符串之间是没有顺序的只有最准确匹配)

2.然后按照配置文件中正则表达式中声明的顺序进行匹配,只要匹配到一条正则表达式,则停止匹配,取正则表达式的匹配结果;(正则表达式之间是有顺序)

3.如果正则表达式没有匹配成功,则取1中的匹配结果;

4.如果正则表达式和普通字符串都没有匹配到,则返回一个404NOT FOUND;

 

⚠️⚠️⚠️:正则匹配会根据匹配顺序,找到第一个匹配的正则表达式后将停止搜索。普通字符串匹配则无视顺序,只会选择最精确的匹配。

 

完成下面一个小需求:

 

 

nginx url美化 nginx $url_正则表达式

常用的配置指令:alias、root、proxy_pass

1.alias:别名设置,用于访问文件系统,在匹配到location的uri后指向alias配置的路径:只能用于location里面

 

location /test {
alias /data/files/; # 最后必须加一个/
}

请求/test/1.txt,将会返回文件/data/files/1.txt;alias其实返回的是alias后面的路径+去掉location路径/文件名

 

alias匹配在正则匹配的location内,则正则表达式必须包含捕获语句也就是加一个英文括号(),而且alias中也要引用这些捕获值;

第一个()里面的内容可以用$1获取到,第二个()里面的内容可以用$2获取到,如:

location ~* /image/(.+\.(png|jpg|jpeg)) {
alias /data/files/$1;
}

请求只要匹配到正则,例如/test/image/1.png或者/image/1.png,都会转为请求/data/files/1.png

 

2.root:根路径配置,用于访问文件系统,不一定要用在location里面。在匹配到location的uri后执行root配置路径拼接location匹配的路径:

 

location /test {
root /data/files; # 最后不能加/
}

请求/test/2.doc,root会转到 /data/files/test/2.doc =====》也就是root后配置的路径+location的路径;

 

3、proxy_pass——反向代理配置,用于代理请求,适用于前后端负载分离或多台机器、服务器负载分离的场景,在匹配到location配置的URL路径后,转发请求到proxy_pass配置额URL,是否会附加location配置路径与proxy_pass配置的路径后是否有"/"有关,有"/"则不附加,如

location /test {
proxy_pass http://192.168.1.1:8080/;
}
访问/test/i.txt会转到http://192.168.1.1:8080/i.txt (没有带location路径的,因为proxy_pass后带了“/”)
 
location = /test/haha {
proxy_pass http://192.168.1.1:8080;
}

访问/test/haha会转到http://192.168.1.1:8080/test/haha (有带location路径的,因为proxy_pass后没有带“/”)