Nginx的location配置详解

💡Location 是 Nginx 中一个非常核心的配置,通过location块,Nginx可以根据URI的不同部分进行匹配,并指定不同的行为,如代理请求、提供静态文件、重定向等。这篇重点讲解一下 Location 的配置问题以及一些注意事项。

语法

关于 Location,举个简单的配置例子:

js 复制代码
http { 
  server {
      listen 80;
    	server_name www.yayujs.com;
    	location / {
      	root /home/www/ts/;
	      index index.html;
    	}
  }
}

大致的意思是,当你访问 www.yayujs.com 的 80 端口的时候,返回 /home/www/ts/index.html 文件。

我们看下 Location 的具体语法:

css 复制代码
location [ = | ~ | ~* | ^~ ] uri { ... }

重点看方括号中的 [ = | ~ | * | ^ ],其中 | 分隔的内容表示你可能会用到的语法,其中:

  • = 表示精确匹配,比如:
js 复制代码
location = /test {
  return 200 "hello";
}

# /test ok
# /test/ not ok
# /test2 not ok
# /test/2 not ok
  • ~ 表示区分大小写的正则匹配,比如:
js 复制代码
location ~ ^/test$ {
  [ configuration ] 
}

# /test ok
# /Test not ok
# /test/ not ok
# /test2 not ok
  • ~* 表示不区分大小写的正则匹配
js 复制代码
location ~* ^/test$ {     
	[ configuration ] 
}

# /test ok
# /Test ok
# /test/ not ok
# /test2 not ok
  • ^~ 表示 uri 以某个字符串开头
js 复制代码
location ^~ /images/ {    
	[ configuration ] 
}

# /images/1.gif ok

而当你不使用这些语法的时候,只写 uri 的时候:

/ 表示通用匹配:

ini 复制代码
location / {     
	[ configuration ] 
}

# /index.html ok
shell 复制代码
location /test {
    [ configuration ] 
}

# /test ok
# /test2 ok
# /test/ ok

匹配顺序

location 的定义分为两种:

  • 前缀字符串(prefix string)
  • 正则表达式(regular expression),具体为前面带 ~* 和 ~ 修饰符的

在优先级上,= 修饰符最高,^~ 次之,再者是正则,最后是前缀字符串匹配。在使用前缀字符串的 locations 中选择最长匹配的,并将结果进行储存。

示例

bash 复制代码
server {
    location /doc {
        [ configuration A ] 
    }
    location /docu {
        [ configuration B ] 
    }
}

# 请求 /document 使用 configuration B
# 虽然 /doc 也能匹配到,但在顺序上,前缀字符串顺序不重要,按照匹配长度来确定
bash 复制代码
server {
    location ~ ^/doc {
        [ configuration A ] 
    }
    location ~ ^/docu {
        [ configuration B ] 
    }
}

# 请求 /document 使用 configuration A
# 虽然 ~ ^/docu 也能匹配到,但正则表达式则按照定义顺序
bash 复制代码
server {
    location ^~ /doc {
        [ configuration A ] 
    }
    location ~ ^/docu {
        [ configuration B ] 
    }
}

# 请求 /document 使用 configuration A
# 虽然 ~ ^/docu 也能匹配到,但 ^~ 的优先级更高
bash 复制代码
server {
    location /document {
        [ configuration A ] 
    }
    location ~ ^/docu {
        [ configuration B ] 
    }
}

# 请求 /document 使用 configuration B
# 虽然 /document 也能匹配到,但正则的优先级更高

root 与 alias 的区别

当我们这样设置 root 的时候:

bash 复制代码
location /i/ {
    root /data/w3;
}

当请求 /i/top.gif ,/data/w3/i/top.gif 会被返回。

当我们这样设置 alias 的时候:

bash 复制代码
location /i/ {
    alias /data/w3/images/;
}

当请求 /i/top.gif ,/data/w3/images/top.gif 会被返回。

root 是直接拼接 root + location,alias英文意思为别名[ˈeɪliəs],不管请求地址是什么,都是在alias定义的目录下找。

比如刚才的请求时/i/top.gif ,直接的请求路径就是 /data/w3/images/ + top.gif

所以如果你这样使用 allias 定义一个路径:

bash 复制代码
location / {
    alias /data/w3/images/;
}

请求是 a/b/i/top.gif ,最终请求地址为 /data/w3/images/ top.gif

server 和 location 中的 root

server 和 location 中都可以使用 root,举个例子:

ini 复制代码
http { 
  server {
      listen 80;
    	server_name www.yayujs.com;
    	root /home/www/website/;
    	location / {
      	root /home/www/ts/;
	      index index.html;
    	}
  }
}

如果两者都出现,是怎样的优先级呢?

简单的来说,就是就近原则,如果 location 中能匹配到,就是用 location 中的 root 配置,忽略 server 中的 root,当 location 中匹配不到的时候,则使用 server 中的 root 配置。

相关推荐
闻道且行之3 小时前
Nginx 安装、做成服务及 HTTPS 配置全流程
linux·运维·nginx·https
人生匆匆3 小时前
在nginx上为 IP 地址生成 SSL 证书并在windosw签证
tcp/ip·nginx·ssl
Sunny_yiyi4 小时前
阿里云轻量服务器安装nginx(不期而遇)
服务器·nginx·阿里云
南梦浅5 小时前
校园失物招领平台项目自动化部署指南(Docker + Nginx)
nginx·docker·自动化
AquaPluto5 小时前
Nginx的性能优化
nginx·性能优化
冬奇Lab1 天前
一天一个开源项目(第46篇):Caddy - 自动 HTTPS 的现代化 Web 服务器,支持 HTTP/3
网络协议·nginx·开源
顺风尿一寸4 天前
Nginx源码分析:变量系统的设计与请求生命周期中的日志记录
nginx
十二7407 天前
前端缓存踩坑实录:从版本号管理到自动化构建
前端·javascript·nginx
可观测性用观测云7 天前
云原生网关 Ingress-Nginx 链路追踪实战:OpenTelemetry 采集与观测云集成方案
nginx·kubernetes