nginx location 介绍

Nginx 配置中的 location 指令是其核心功能之一,用于定义如何根据客户端请求的URI(统一资源标识符)来处理和路由HTTP请求。它允许管理员精细地控制对特定URL路径的响应行为,如提供静态内容、执行重定向、设置访问权限、应用反向代理规则等。以下是对 location 指令的详细介绍:

1. 位置与作用域

location 指令出现在 Nginx 配置文件的 server 块内部,用于细化该虚拟主机(server block)下的请求处理规则。一个 server 块可以包含多个 location 块,每个 location 都负责定义一组针对特定请求URI的处理逻辑。

2. 匹配规则

location 指令后跟随一个 URI 模式,用于匹配客户端请求的URL路径。Nginx支持多种类型的匹配规则:

a. 精确匹配 (=)

1
2
3
location = /exact/path {
# ...配置...
}

使用等号(=, 即 = 前缀)表示精确匹配,只有当请求URI与指定路径完全一致时,此 location 才会被选中。这是最严格的匹配类型,一旦找到精确匹配,Nginx将立即停止查找其他 location 规则。

b. 前缀匹配 (^~)

1
2
3
location ^~ /prefix/ {
# ...配置...
}

使用 ^~ 前缀表示前缀匹配。如果请求URI以指定的前缀开始,且该 location 是所有非正则 location 中最长的匹配前缀,Nginx将选择此规则并停止后续的正则表达式匹配。这种匹配方式在处理静态内容时效率较高,因为它避免了正则表达式的计算。

c. 正则表达式匹配 (~~*)

1
2
3
4
5
6
7
location ~ \.php$ {
# ...配置...
}

location ~* \.(gif|jpg|png)$ {
# ...配置...
}

使用波浪线 (~) 表示区分大小写的正则表达式匹配,而 ~* 表示不区分大小写的正则匹配。这些规则按照它们在配置文件中出现的顺序进行检查。如果请求URI与某个正则表达式匹配,Nginx将选择该规则并停止进一步的匹配尝试。

d. 通用匹配 (/)

1
2
3
location / {
# ...配置...
}

使用斜杠 (/) 表示通用匹配,即匹配所有未被前面更具体规则匹配到的请求。通常作为默认处理规则,放置在 location 配置块的末尾。

3. 匹配顺序与优先级

当Nginx收到一个请求时,它按照以下优先级顺序检查 location 规则:

  1. 精确匹配 (=)
  2. 完整路径匹配 (无特殊前缀的普通路径,如 location /path/to/resource { ... })
  3. 前缀匹配 (^~)
  4. 正则表达式匹配 (~~*,按照配置文件中出现的顺序)
  5. 通用匹配 (/)

一旦找到匹配的 location,Nginx将立即停止查找并执行该位置块中的配置。如果同一类型(如两个正则表达式)的多个 location 都能匹配,那么将选择第一个出现的匹配规则。

4. 配置块内容

location 块内可以包含多种配置指令,用于定义对匹配请求的处理方式。常见的用法包括:

a. 提供静态内容

通过 rootalias 指令指定静态文件的根目录或别名路径,配合 index 指令指定默认首页文件,使Nginx能够直接返回服务器上的静态HTML、CSS、JavaScript、图片等文件。

b. 反向代理

使用 proxy_pass 指令将请求转发到上游服务器(如应用服务器),实现负载均衡、API网关等功能。通常需要配合 proxy_set_headerproxy_cacheproxy_buffering 等指令调整代理行为。

c. 重定向

利用 returnrewrite 指令实现URL重定向,可以是永久重定向(状态码301)或临时重定向(状态码302)。重定向可用于URL规范化、网站迁移、SEO优化等场景。

d. 访问控制

通过 allowdeny 指令限制对特定资源的访问,可以根据IP地址、CIDR块、子网掩码等方式进行访问控制。还可以结合 auth_basicauth_basic_user_file 实现基于用户名和密码的HTTP基本认证。

e. 缓存控制

配置 expiresadd_header Cache-Control 指令管理静态内容的缓存策略,或者使用 proxy_cache 指令开启反向代理缓存,提高响应速度和减轻上游服务器压力。

f. 错误处理

指定 error_page 指令定义当发生特定HTTP错误状态码时返回的自定义错误页面,提升用户体验和提供更具体的错误信息。

5. 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
server {
listen 80;
server_name example.com;

# 静态文件服务
location /static/ {
alias /var/www/static/;
expires 30d;
}

# PHP-FPM 代理
location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
}

# 重定向旧版URL
location /old-page {
return 301 https://example.com/new-page;
}

# 访问控制
location /admin/ {
allow 192.168.1.0/24;
deny all;
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.htpasswd;
}

# 默认处理规则
location / {
try_files $uri $uri/ /index.php?$args;
}
}

上述示例展示了如何在一个 server 块中配置多个 location,分别实现静态文件服务、PHP脚本的反向代理、URL重定向、访问控制以及默认请求处理逻辑。

总结来说,Nginx 的 location 指令提供了强大的请求路由和处理能力,允许管理员灵活地根据请求URI的不同部分来定制响应行为,是构建高性能、高可用Web服务的关键工具之一。通过精确、前缀、正则和通用匹配规则的组合,以及在匹配块中配置的各种指令,Nginx能够应对各种复杂的应用场景和需求。