nginx的location指令用于匹配请求的URL,并指定相关的配置项。它的匹配规则如下
location匹配的的nginx变量是: $request_uri ;
location匹配种类: 格式:location [ 空格 | = | ~ | ~* | !~ | !~* | @ ] /uri/ {} ;
详解如下:
1.精准匹配(如果找到,立即停止搜索并立即处理此请求): 用"="指定一个精确的URL,只有当请求的URL与指定的URL完全匹配时,才会应用相关的配置项。
例如:location = /test 会匹配到请求URI为"/test"的请求。
2.前缀匹配:用"^~"指定一个前缀字符串,当请求的URI以指定的字符串开头时,会应用相关的配置项。
例如:location ^~ /images/ 会匹配到请求URI以"/images/"开头的请求。
3. 正则匹配:用"~"或"~*"指定一个正则表达式,当请求的URI与正则表达式匹配时,会应用相关的配置项。其中,"~"表示区分大小写,"~*"表示不区分大小写。反推"!~"代表区分大小写不匹配 , "!~*"代表不区分大小写不匹配。
例如:location ~* \.(jpg|jpeg|gif)$ 会匹配到请求URI以".jpg"、".jpeg"或".gif"结尾的请求。
4.最长前缀匹配"/"(表示通用匹配,任何请求都会匹配到):如果没有匹配到精确匹配、前缀匹配或正则匹配的location块,则会使用最长前缀匹配。
例如:location / 会匹配到任何请求。
5. "@" 指定一个命名的location,一般只用于内部重定向请求。例如 error_page, try_files
备注:^~优先级高于其他正则匹配
nginx代理中/反斜杠用法
这里通过示例展示不同斜杠的用法情况
nginx 服务器及端口 127.0.0.1:80
后端服务:127.0.0.1:8080
测试url: http://127.0.0.1:80/test/api/abc
location /test/ {
proxy_pass http://127.0.0.1:8080/;
}
实际访问的端口服务:http://127.0.0.1:8080/api/abc
location /test {
proxy_pass http://127.0.0.1:8080/;
}
实际访问的端口服务:http://127.0.0.1:8080//api/abc
location /test/ {
proxy_pass http://127.0.0.1:8080;
}
实际访问的端口服务:http://127.0.0.1:8080/test/api/abc
location /test {
proxy_pass http://127.0.0.1:8080;
}
实际访问的端口服务:http://127.0.0.1:8080/test/api/abc
location /test/ {
proxy_pass http://127.0.0.1:8080/server/;
}
实际访问的端口服务:http://127.0.0.1:8080/server/api/abc
location /test {
proxy_pass http://127.0.0.1:8080/server/;
}
实际访问的端口服务:http://127.0.0.1:8080/server//api/abc
location /test/ {
proxy_pass http://127.0.0.1:8080/server;
}
实际访问的端口服务:http://127.0.0.1:8080/serverapi/abc
location /test {
proxy_pass http://127.0.0.1:8080/server;
}
实际访问的端口服务:http://127.0.0.1:8080/server/api/abc
上边location的"/"仅用来匹配测试url,不具备特殊意义。
下边proxy不接目录时,若没有"/",最终地址要拼接 location
下边不接目录时,若有"/",location不拼入最后结果
下边接目录,也视为proxy_pass端口后有"/“的情况,所接目录后的”/"不具备特殊意义,原样接入最终地址(有接有,无接无)。
简单总结如下
上边有"/",下边端口有”/“,不接location。下边目录原封不动拼入最后结果(下边没目录,但有”/",可视为目录为空)
下边端口后没"/"(不管上边没有没有),要拼接location