nginx Location 节点常用指令
root
语法:root path;
默认值:root html;
作用:设置请求的根目录。
示例:
代码语言:shell复制location /i/ {
root /data/w3;
}
这时请求 /i/top.gif
会返回服务器中 /data/w3/i/top.gif
路径文件。
alias
语法:alias path;
作用:定义 location 的替换路径。也就是别名的意思。
示例:
代码语言:shell复制location /i/ {
alias /data/w3/images/;
}
这时请求 /i/top.gif
会将路径中的 i 替换成服务器路径的 /data/w3/images/
,也就是最终返回 /data/w3/images/top.gif
。如果定义的路径是文件夹,那么需要使用 / 结尾。比如当前如果不是 / 结尾的话那么最终返回的文件会是 /data/w3/imagestop.gif
。
location
语法:
代码语言:scss复制location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
代码语言:shell复制1、~ # 使用波浪符“ ~”区分大小写正则匹配,如 location ~ /abc { }
2、~* #不区分大小写的正则匹配,如 location ~* /abc { }
3、^~ # 匹配路径的前缀,如果找到停止搜索,如 location ^~ /abc { }
4、= #精确匹配 如 location = /abc { }
5、 #普通路径前缀匹配 如 location /abc { }
优先级
4 > 3 > 2 > 1 > 5。如果在同一个类型当中不同的前缀,则匹配度越高的优先级越高。
~
代码语言:shell复制location ~ /html.?/ {
root /usr/html;
}
请求 http://localhost:6765/1111/html1/1112.txt
访问后最终映射到 /usr/html/1111/html1/1112.txt
。当前正则表示只要出现了 html 那么就能被匹配,因为请求中 html1 带有 html 所有请求匹配成功,这时候路径拼接规则会将 hostname 后的地址截取,也就是 1111/html1/1112.txt
部分拼接到 /usr/html
的后面,所以最终的访问地址是 /usr/html/1111/html1/1112.txt
。
注意:window环境下目录是大小写不敏感的,所以在win环境下测试大小写失效
proxy_pass
语法:proxy_pass URL
作用:设置代理服务器的协议和地址以及location中可以匹配的一个可选的URI。协议可以是"http"或"https"。地址可以是一个域名或ip地址和端口,或者一个 unix-domain socket 路径。
URI 匹配规则
proxy_pass 中有两种情况,第一种是带 uri,另外一种是不带 uri 的。如果是带 uri 是直接匹配部分后拼接到代理地址后,如果是不带 uri 则是 uri 匹配部分后拼接到代理地址后。
带 uri
代码语言:shell复制server {
listen 6765;
location /html/ {
proxy_pass http://127.0.0.1:9028/;
}
}
访问地址:http://localhost:6765/html/test,最终的映射是代理地址【http://127.0.0.1:9028/ 匹配部分后【test】 -> http://127.0.0.1:9028/test
location /html/ {
proxy_pass http://127.0.0.1:9028/ttt;
}
访问地址:http://localhost:6765/html/test,最终的映射是代理地址 【http://127.0.0.1:9028/ttt】 匹配部分后【test】 -> http://127.0.0.1:9028/ttttest
location /html/ {
proxy_pass http://127.0.0.1:9028/ttt/;
}
访问地址:http://localhost:6765/html/test,最终的映射是代理地址【http://127.0.0.1:9028/ttt/】 匹配部分后【test】 -> http://127.0.0.1:9028/ttt/test
不带 uri
代码语言:ruby复制location /html/ {
proxy_pass http://127.0.0.1:9028;
}
访问地址:http://localhost:6765/html/test,最终的映射是代理地址【http://127.0.0.1:9028】 uri【/html/】 匹配部分后【test】-> http://127.0.0.1:9028/html/test
location ~ /html/ {
proxy_pass http://127.0.0.1:9028;
}
访问地址:http://localhost:6765/api/html/test,最终的映射是代理地址【http://127.0.0.1:9028】 uri【/api/html/】 匹配部分后【test】-> http://127.0.0.1:9028/api/html/test
注意:如果使用正则后就不能带 uri 了,也就是不能使用 http://127.0.0.1:9028/ 等。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!