• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Nginx中location实现多条件匹配的方法详解

    发布者: 福建二哥 | 发布时间: 2025-8-16 17:44| 查看数: 71| 评论数: 0|帖子模式

    1. 概述

    在 Nginx 中,
    1. location
    复制代码
    指令用于匹配请求的 URI,并根据匹配结果执行相应的逻辑。虽然
    1. location
    复制代码
    本身是基于单一匹配规则的,但可以通过多种方式实现多个条件的匹配逻辑。

    2. 实现多条件匹配的方式


    2.1 使用多个 location 块

    Nginx 支持定义多个
    1. location
    复制代码
    块,每个
    1. location
    复制代码
    块可以匹配不同的条件。Nginx 会根据优先级选择最匹配的
    1. location
    复制代码

    示例:
    1. server {
    2.     listen 80;

    3.     # 匹配 /xianyang/ 路径
    4.     location /xianyang/ {
    5.         proxy_pass http://10.175.12.236:8080;
    6.         add_header 'Access-Control-Allow-Origin' '*';
    7.     }

    8.     # 匹配 /api/ 路径
    9.     location /api/ {
    10.         proxy_pass http://10.175.12.237:8080;
    11.         add_header 'Access-Control-Allow-Origin' '*';
    12.     }

    13.     # 默认匹配
    14.     location / {
    15.         root html;
    16.         index index.html;
    17.     }
    18. }

    19. server {
    20.     listen 80;

    21.     # 匹配 /xianyang/ 路径
    22.     location /xianyang/ {
    23.         proxy_pass http://10.175.12.236:8080;
    24.         add_header 'Access-Control-Allow-Origin' '*';
    25.     }

    26.     # 匹配 /api/ 路径
    27.     location /api/ {
    28.         proxy_pass http://10.175.12.237:8080;
    29.         add_header 'Access-Control-Allow-Origin' '*';
    30.     }

    31.     # 默认匹配
    32.     location / {
    33.         root html;
    34.         index index.html;
    35.     }
    36. }
    复制代码
    优先级规则:

    • 精确匹配
      1. location = /path
      复制代码
      )优先级最高。
    • 正则表达式匹配
      1. location ~ /path
      复制代码
      )次之。
    • 前缀匹配
      1. location /path
      复制代码
      )优先级最低。

    2.2 使用正则表达式匹配多个条件

    如果需要在一个
    1. location
    复制代码
    块中匹配多个路径,可以使用正则表达式。
    示例:
    1. server {
    2.     listen 80;

    3.     # 匹配 /xianyang/ 或 /api/ 路径
    4.     location ~ ^/(xianyang|api)/ {
    5.         proxy_pass http://10.175.12.236:8080;
    6.         add_header 'Access-Control-Allow-Origin' '*';
    7.     }

    8.     # 默认匹配
    9.     location / {
    10.         root html;
    11.         index index.html;
    12.     }
    13. }
    复制代码
    说明:

      1. ~
      复制代码
      表示启用正则表达式匹配。
      1. ^/(xianyang|api)/
      复制代码
      表示匹配以
      1. /xianyang/
      复制代码
      1. /api/
      复制代码
      开头的路径。

    2.3 使用 map 指令动态选择后端

    如果需要根据路径或其他条件动态选择后端服务器,可以使用
    1. map
    复制代码
    指令。
    示例:
    1. http {
    2.     # 定义 $backend 变量,根据路径动态选择后端
    3.     map $uri $backend {
    4.         default http://default-backend:8080;

    5.         "~^/xianyang/" http://10.175.12.236:8080;
    6.         "~^/api/" http://10.175.12.237:8080;
    7.     }

    8.     server {
    9.         listen 80;

    10.         location / {
    11.             proxy_pass $backend;  # 使用动态选择的 $backend
    12.             proxy_set_header Host $host;
    13.             proxy_set_header X-Real-IP $remote_addr;
    14.         }
    15.     }
    16. }
    复制代码
    说明:

      1. map $uri $backend
      复制代码


      • 根据
        1. $uri
        复制代码
        的值动态设置
        1. $backend
        复制代码

        1. ~^/xianyang/
        复制代码
        匹配以
        1. /xianyang/
        复制代码
        开头的路径。
        1. ~^/api/
        复制代码
        匹配以
        1. /api/
        复制代码
        开头的路径。


    2.4 使用 if 条件实现多个条件

    虽然不推荐过度使用
    1. if
    复制代码
    ,但在某些场景下可以通过
    1. if
    复制代码
    实现多个条件的匹配。
    示例:
    1. server {
    2.     listen 80;

    3.     location / {
    4.         # 根据路径动态选择后端
    5.         if ($uri ~* "^/xianyang/") {
    6.             proxy_pass http://10.175.12.236:8080;
    7.         }

    8.         if ($uri ~* "^/api/") {
    9.             proxy_pass http://10.175.12.237:8080;
    10.         }

    11.         # 默认后端
    12.         if ($uri !~* "^/xianyang/" && $uri !~* "^/api/") {
    13.             root html;
    14.             index index.html;
    15.         }
    16.     }
    17. }
    复制代码
    注意事项:

      1. if
      复制代码
      的性能较低,尽量避免在
      1. location
      复制代码
      中过度使用。
      1. if
      复制代码
      条件中不能直接使用
      1. proxy_pass
      复制代码
      和其他指令的组合,需要小心使用。

    2.5 使用 try_files 实现多条件匹配

    如果需要根据文件或路径的存在性来选择不同的处理逻辑,可以使用
    1. try_files
    复制代码

    示例:
    1. server {
    2.     listen 80;

    3.     location / {
    4.         # 尝试匹配文件,如果不存在则转发到后端
    5.         try_files $uri @backend;
    6.     }

    7.     location @backend {
    8.         # 根据路径选择后端
    9.         if ($uri ~* "^/xianyang/") {
    10.             proxy_pass http://10.175.12.236:8080;
    11.         }

    12.         if ($uri ~* "^/api/") {
    13.             proxy_pass http://10.175.12.237:8080;
    14.         }

    15.         # 默认后端
    16.         proxy_pass http://default-backend:8080;
    17.     }
    18. }
    复制代码
    说明:

      1. try_files $uri @backend
      复制代码


      • 尝试匹配文件路径
        1. $uri
        复制代码

      • 如果文件不存在,则跳转到
        1. @backend
        复制代码
        命名位置。


    2.6 使用 include 分离多个 location 配置

    如果需要管理多个
    1. location
    复制代码
    块,可以将它们分离到单独的文件中,并通过
    1. include
    复制代码
    指令引入。
    示例:
    主配置文件:
    1. server {
    2.     listen 80;

    3.     include /etc/nginx/conf.d/*.conf;  # 引入所有 .conf 文件
    4. }
    复制代码
    1. /etc/nginx/conf.d/xianyang.conf
    复制代码
    1. location /xianyang/ {
    2.     proxy_pass http://10.175.12.236:8080;
    3.     add_header 'Access-Control-Allow-Origin' '*';
    4. }
    复制代码
    1. /etc/nginx/conf.d/api.conf
    复制代码
    1. location /api/ {
    2.     proxy_pass http://10.175.12.237:8080;
    3.     add_header 'Access-Control-Allow-Origin' '*';
    4. }
    复制代码
    说明:
    使用
    1. include
    复制代码
    可以将配置文件模块化,便于管理和维护。

    2.7 综合示例:多条件匹配

    以下是一个综合示例,结合了前缀匹配、正则表达式和默认后端:
    1. server {
    2.     listen 80;

    3.     # 精确匹配 /xianyang/
    4.     location = /xianyang/ {
    5.         proxy_pass http://10.175.12.236:8080;
    6.         add_header 'Access-Control-Allow-Origin' '*';
    7.     }

    8.     # 匹配 /xianyang/ 或 /api/ 路径(正则表达式)
    9.     location ~ ^/(xianyang|api)/ {
    10.         proxy_pass http://10.175.12.236:8080;
    11.         add_header 'Access-Control-Allow-Origin' '*';
    12.     }

    13.     # 默认匹配
    14.     location / {
    15.         root html;
    16.         index index.html;
    17.     }
    18. }
    复制代码
    3. 总结


    • 多个
      1. location
      复制代码
      块:适合简单的条件匹配,Nginx 会根据优先级选择最匹配的
      1. location
      复制代码

    • 正则表达式:适合需要匹配多个路径的场景。
      1. map
      复制代码
      指令:适合动态选择后端服务器。
      1. if
      复制代码
      条件:可以实现复杂的逻辑,但性能较低,应谨慎使用。
      1. try_files
      复制代码
      :适合根据文件存在性选择不同的处理逻辑。
      1. include
      复制代码
      :适合将配置模块化,便于管理。
    根据具体需求选择合适的方式。如果需要更复杂的逻辑,通常推荐使用
    1. map
    复制代码
    或正则表达式来实现多条件匹配。
    到此这篇关于Nginx中location实现多条件匹配的方法详解的文章就介绍到这了,更多相关Nginx location多条件匹配内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表