nginx Location 节点常用指令

2023-11-20 14:18:29 浏览数 (1)

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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞