Nginx Location 指令用法详解
2025年3月29日...大约 2 分钟
Nginx Location 指令用法详解
location 指令是 Nginx 配置中最核心的指令之一,用于匹配请求 URI 并定义如何处理这些请求。下面我将详细介绍 location 的用法并提供实际案例。
基本语法
location [修饰符] 匹配模式 {
# 配置指令
}
匹配修饰符
Nginx 的 location 支持以下几种匹配方式:
无修饰符
:前缀匹配=
:精确匹配~
:区分大小写的正则匹配~*
:不区分大小写的正则匹配^~
:优先前缀匹配(一旦匹配不再检查正则)
匹配优先级
Nginx 按以下顺序检查 location:
- 精确匹配 (
=
) - 优先前缀匹配 (
^~
) - 正则匹配 (
~
或 **~
,按配置文件中的顺序) - 普通前缀匹配
实际案例
案例1:精确匹配
location = /login {
# 只匹配 /login 这个精确路径
proxy_pass http://auth_server;
}
案例2:前缀匹配
location /images/ {
# 匹配以 /images/ 开头的所有请求
root /data/static;
expires 30d;
}
案例3:正则匹配(区分大小写)
location ~ \.(php|php5)$ {
# 匹配以 .php 或 .php5 结尾的请求,区分大小写
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}
案例4:正则匹配(不区分大小写)
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
# 匹配图片、CSS、JS等静态文件,不区分大小写
root /data/static;
access_log off;
expires 365d;
}
案例5:优先前缀匹配
location ^~ /static/ {
# 匹配以 /static/ 开头的请求,优先于正则匹配
root /data/www;
}
案例6:综合配置示例
server {
listen 80;
server_name example.com;
# 精确匹配首页
location = / {
proxy_pass http://frontend;
}
# 优先处理静态文件
location ^~ /static/ {
root /var/www/html;
expires max;
}
# 处理API请求
location /api/ {
proxy_pass http://backend;
proxy_set_header Host $host;
}
# 处理PHP文件
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
include fastcgi_params;
}
# 默认处理其他请求
location / {
try_files $uri $uri/ /index.html;
}
}
路径重写
location ~ ^/service(/?|/.*)$ {
# 重写规则:/service → /, /service/abc → /abc
rewrite ^/service(/?)(.*)$ /$2 break;
# 必须不带URI(因为这里是正则匹配)
proxy_pass http://backend;
# 关键头信息传递
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
upstream backend {
server 192.168.1.122;
}
/service = 192.168.1.122
/service/ = 192.168.1.122/
/service/abc = 192.168.1.122/abc
特殊用法
命名 location
location @fallback {
# 命名的location,只能被内部重定向使用
proxy_pass http://backend;
}
使用 try_files
location / {
try_files $uri $uri/ @fallback;
}
注意事项
- location 匹配是基于 URI 的,不包含查询字符串(?后面的部分)
- 正则匹配中的特殊字符需要转义
- 多个 location 的配置顺序会影响匹配结果
- 在 location 中使用
root
和alias
有区别:root
会将 location 路径附加到 root 路径后alias
会用 alias 路径替换 location 路径
location /i/ {
root /data/w3; # 文件路径会是 /data/w3/i/top.gif
}
location /i/ {
alias /data/w3/images/; # 文件路径会是 /data/w3/images/top.gif
}
通过合理使用 location 指令,可以非常灵活地控制 Nginx 对不同请求的处理方式。
贡献者
lichangyangccm@163.com