Nginx Location 指令与域名配置详解
在 Nginx 服务器配置中,location 指令是与域名(或主机名)协同工作的核心组件,用于根据客户端请求的 URI 路径或域名匹配不同的处理规则,通过合理配置 location 与域名,可以实现负载均衡、反向代理、静态资源分离、访问控制等高级功能,本文将从基础语法、匹配规则、域名优先级及实际应用场景等方面,系统解析 Nginx 中 location 与域名的配置方法。

Location 指令的基础语法
location 指令通常定义在 server 块内,用于匹配请求的 URI(统一资源标识符),其基本语法结构如下:
location [修饰符] pattern {
# 配置指令,如 root、proxy_pass、try_files 等
}
修饰符 决定了匹配的严格程度,常见的修饰符包括:
- :精确匹配,仅当 URI 完全等于
pattern时触发,优先级最高。 ^~:前缀匹配,一旦 URI 以pattern开头即停止搜索其他正则表达式匹配。- :区分大小写的正则表达式匹配。
- *`~`**:不区分大小写的正则表达式匹配。
- :无修饰符时,表示前缀匹配,优先级低于正则表达式修饰符。
若未指定修饰符,Nginx 会按 → ^~ → 正则表达式(/)→ 无修饰符的顺序进行匹配,找到第一个匹配项后即停止搜索。
域名与 Location 的协同工作
Nginx 通过 server 块绑定域名,每个 server 块通过 server_name 指令指定监听的域名(或 IP 地址),当请求到达 Nginx 时,会先根据请求头中的 Host 字段匹配 server_name,若未匹配到则使用默认 server 块(通常为配置文件中第一个 server 块),匹配到 server 块后,再进一步通过 location 指令处理请求的 URI。
以下配置展示了域名与 location 的基本结合:

server {
listen 80;
server_name example.com www.example.com; # 绑定多个域名
location / {
root /var/www/html; # 根目录
index index.html; # 默认首页
}
location /api {
proxy_pass http://backend_server; # 反向代理到后端服务
}
}
上述配置中,所有访问 example.com 或 www.example.com 的请求,若 URI 为 或 /index.html,则返回 /var/www/html 目录下的静态文件;若 URI 以 /api 开头,则转发至后端服务器处理。
Location 匹配规则的优先级
当多个 location 规则同时存在时,匹配顺序直接影响配置效果,优先级从高到低依次为:
- 精确匹配():适用于固定路径,如
location = /login,仅匹配/login路径,不会匹配/login/或/login?user=test。 - 前缀匹配(
^~):当 URI 以指定前缀开头时立即匹配,忽略后续正则表达式。location ^~ /images/,请求/images/avatar.jpg会直接匹配此规则,不再检查其他正则location。 - *正则表达式匹配(/`~
)**:按配置文件中的顺序依次匹配,直到找到第一个符合条件的规则。~因不区分大小写,适合处理动态文件扩展名(如location ~ .(jpg|jpeg|png)$`)。 - 普通前缀匹配:无修饰符的前缀匹配,优先级最低,
location /docs会匹配所有以/docs开头的路径。
示例:
location = / {
root /var/www/root; # 优先级最高,仅匹配根路径
}
location ^~ /static/ {
root /var/www/static; # 优先级次之,匹配 /static/ 开头的路径
}
location ~* \.php$ {
proxy_pass http://php_server; # 匹配所有 .php 文件,区分大小写
}
location / {
root /var/www/default; # 默认匹配,优先级最低
}
Location 的常见应用场景
-
静态资源分离
通过location将静态文件(如图片、CSS、JS)与动态请求分离,提高访问效率。location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ { root /var/www/static; expires 7d; # 设置缓存有效期 } -
反向代理与负载均衡
结合proxy_pass将动态请求转发到后端服务器,并通过upstream实现负载均衡:
upstream backend_pool { server 192.168.1.10:8000; server 192.168.1.11:8000; } location /app { proxy_pass http://backend_pool; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } -
访问控制
通过allow和deny指令限制特定 IP 访问,location /admin { allow 192.168.1.0/24; # 允许内网访问 deny all; # 禁止其他 IP auth_basic "Admin Area"; # 启用 basic 认证 auth_basic_user_file /etc/nginx/.htpasswd; } -
URL 重写
使用rewrite指令修改请求 URI,例如将旧路径重定向到新路径:location ~ ^/old/(.*)$ { rewrite ^/old/(.*)$ /new/$1 permanent; # 301 永久重定向 }
配置注意事项
- 优先级顺序:确保高优先级
location(如 、^~)位于配置文件靠前位置,避免被低优先级规则覆盖。 - 正则表达式性能:复杂的正则表达式可能影响匹配效率,建议优先使用前缀匹配(
^~)。 try_files指令:用于检查文件是否存在,避免直接重定向到后端,location / { try_files $uri $uri/ /index.php?$query_string; }- 测试与验证:修改配置后使用
nginx -t检查语法正确性,通过curl -H "Host: example.com" http://localhost/模拟请求验证匹配结果。
Nginx 的 location 指令与域名配置是实现灵活请求调度的关键,通过理解匹配规则、优先级及应用场景,可以高效构建高性能、高可用的 Web 服务,无论是静态资源优化、动态代理还是访问控制,合理的 location 与域名组合都能显著提升服务器的响应能力和安全性,在实际配置中,需结合业务需求不断调试优化,确保规则清晰、逻辑严谨,从而充分发挥 Nginx 作为 Web 服务器的潜力。