×

Nginx location写法全解析:匹配规则+优先级+实操案例

hqy hqy 发表于2026-02-07 23:13:45 浏览5 评论0

抢沙发发表评论

前言

Nginx的location模块是配置网站访问规则的核心——它能根据客户端的请求路径,精准匹配并返回不同响应,比如指定静态资源目录、配置URL重写、设置错误页面等。很多新手配置Nginx时,会被location的符号(=、~、~*、^~)和优先级搞晕,导致规则不生效。本文用通俗的语言拆解location的4种核心写法、优先级顺序,搭配实操案例,代码可直接复制,新手也能快速掌握,轻松搞定Nginx访问匹配需求。


图片

一、location核心语法与写法(4种必掌握)

location的核心作用是“匹配客户端请求路径”,语法格式固定,不同符号对应不同匹配规则,按需选择即可:

location [ 匹配符号 ]  请求路径(uri) {
    匹配成功后的响应配置;
}

1. 精确匹配:=(优先级最高)

  • 规则

    :仅匹配与请求路径完全一致的地址,多一个字符、少一个字符都不匹配;
  • 适用场景

    :匹配固定的单一路径(如首页、特定接口),精准度最高,效率最快。

实操案例

# 1. 仅匹配 "http://www.linux.com/"(首页,精确匹配根路径)
location = / {
    root /data/www;
    index index.html;
}

# 2. 仅匹配 "http://www.linux.com/test"(精确匹配/test,不匹配/test/、/test123等)
location = /test {
    root /data;
    index index.html;
}
  • 访问测试:

    • 访问 http://www.linux.com/→ 匹配成功,加载 /data/www/index.html
    • 访问 http://www.linux.com/test→ 匹配成功,加载 /data/test/index.html
    • 访问 http://www.linux.com/test/(多了斜杠)→ 不匹配,触发其他location规则。

2. 正则匹配(区分大小写):~

  • 规则

    :使用正则表达式匹配请求路径,严格区分大小写(如/test和/Test是不同路径);
  • 适用场景

    :需要按文件后缀、路径格式匹配(如仅允许访问图片、PHP文件)。

实操案例

# 1. 匹配所有包含/test的路径(区分大小写,/Test、/TEST不匹配)
location ~ /test {
    root /data;
    index index.html;
}

# 2. 匹配后缀为jpg、jpeg、gif、png的图片文件(区分大小写,.JPG、.PNG不匹配)
location ~ \.(jpg|jpeg|gif|png)$ {
    root /data/images;
    expires 7d;  # 图片缓存7天,提升访问速度
}

# 3. 匹配所有.php后缀的文件(仅处理PHP请求,区分大小写,.PHP不匹配)
location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;  # 转发给PHP-FPM处理
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}
  • 正则说明:$表示“结束”,确保仅匹配后缀为指定字符的路径;|表示“或”,匹配多个后缀。

3. 正则匹配(不区分大小写):~*

  • 规则

    :与~功能一致,唯一区别是不区分大小写(如/test、/Test、/TEST都能匹配);
  • 适用场景

    :无需区分大小写的匹配(如允许用户随意输入后缀大小写访问图片、文件)。

实操案例

# 匹配所有.php后缀的文件(不区分大小写,.PHP、.Php、.php都匹配)
location ~* \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

# 匹配图片文件(不区分大小写,.JPG、.GIF、.png等都匹配)
location ~* \.(jpg|jpeg|gif|png|bmp)$ {
    root /data/images;
    expires 30d;
}
  • 优势:兼容性更强,避免用户因输入大小写错误导致访问失败。

4. 前缀匹配(非正则):^~

  • 规则

    :按请求路径的前缀匹配,不使用正则表达式,匹配到最长前缀后立即生效,不再检查其他正则匹配规则;
  • 适用场景

    :匹配固定前缀的目录(如/static、/admin),优先级高于正则匹配(~、~*),效率比正则高。

实操案例

# 匹配所有以/test开头的路径(/test、/test/、/test/abc、/test123等)
location ^~ /test {
    root /data;
    index index.html;
}

# 对比:无^~的前缀匹配(优先级低于正则)
location /test {
    root /data/default;
    index index.html;
}
  • 关键区别:

    • 若同时存在 ^~ /test和 ~ /test,访问 /test会优先匹配 ^~ /test(前缀匹配优先级高于正则);
    • ^~的前缀匹配(如location /test)优先级最低,仅在没有其他匹配规则时生效。

二、location优先级顺序(核心!避免规则冲突)

当一个请求能被多个location匹配时,Nginx会按“优先级从高到低”选择规则,这是配置不生效的核心原因,必须牢记:

优先级排序(从高到低)

  1. 精确匹配(=):完全匹配才生效,优先级最高;

  2. 前缀匹配(^~):匹配最长前缀后立即生效,跳过后续正则匹配;

  3. 正则匹配(~、~*):按配置文件中“从上到下”的顺序匹配,先配置的优先;

    • 注:~~*属于同一优先级,谁在配置文件中写前面,谁先生效;
  4. 普通前缀匹配(无符号):匹配最长前缀,仅在无其他规则匹配时生效;

  5. 默认匹配(location /):所有规则都不匹配时,触发该默认规则。

优先级实操验证(经典案例)

以下是配置文件中的location规则,通过访问测试理解优先级:

# 规则A:精确匹配根路径
location = / {
    echo "配置A:精确匹配/";
}

# 规则B:默认匹配(所有路径都能匹配,优先级最低)
location / {
    echo "配置B:默认匹配/";
}

# 规则C:普通前缀匹配/documents/
location /documents/ {
    echo "配置C:普通前缀匹配/documents/";
}

# 规则D:前缀匹配/images/(^~)
location ^~ /images/ {
    echo "配置D:前缀匹配(^~)/images/";
}

# 规则E:正则匹配图片后缀(不区分大小写)
location ~* \.(gif|jpg|jpeg)$ {
    echo "配置E:正则匹配图片后缀";
}

访问测试结果(对应优先级)

  1. 访问 http://www.linux.com/→ 匹配规则A(精确匹配优先级最高);
  2. 访问 http://www.linux.com/images/1.jpg→ 匹配规则D(^~前缀匹配,跳过正则规则E);
  3. 访问 http://www.linux.com/documents/1.jpg→ 匹配规则E(正则匹配优先级高于普通前缀匹配C);
  4. 访问 http://www.linux.com/test/123→ 匹配规则B(无其他规则匹配,触发默认规则);
  5. 访问 http://www.linux.com/documents/test.txt→ 匹配规则C(普通前缀匹配,无更高优先级规则)。

三、实用拓展:location配置错误页面

通过location配合error_page指令,可自定义错误页面(如404、500页面),提升用户体验:

实操案例

# 1. 定义404错误页面:访问不存在的路径时,跳转至/sorry.html
error_page 404 /sorry.html;

# 2. 精确匹配/sorry.html,指定错误页面的存放目录
location = /sorry.html {
    root /data/error;  # 错误页面路径:/data/error/sorry.html
}

# 3. 拓展:定义500(服务器错误)、403(权限拒绝)错误页面
error_page 500 502 503 504 /50x.html;
error_page 403 /forbidden.html;

location = /50x.html {
    root /data/error;
}

location = /forbidden.html {
    root /data/error;
}
  • 准备工作:在 /data/error目录下创建 sorry.html50x.html等错误页面文件,写入自定义内容(如“页面不存在,请检查路径是否正确”)。

总结

  1. location核心:4种匹配符号(=、~、~*、^~)+ 优先级顺序,是配置生效的关键;
  2. 符号选择:精确匹配用=,正则匹配用~(区分大小写)/~*(不区分),前缀匹配用^~
  3. 优先级避坑:^~优先级高于正则,正则按配置顺序匹配,默认匹配(/)优先级最低;
  4. 实用场景:静态资源(图片、JS)用~*匹配,固定目录用^~,特定路径用=,错误页面用error_page+location=

掌握这些规则后,不管是配置静态资源访问、URL重写,还是自定义错误页面,都能精准匹配,避免规则冲突。建议新手多动手测试,熟悉优先级后就能灵活运用!


打赏

本文链接:https://www.kinber.cn/post/6213.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客