插件窝 干货文章 nginx location中uri的截取如何实现

nginx location中uri的截取如何实现

截取 Location 使用 Nginx 383    来源:    2025-04-23

Nginx Location URI 截取实现方法

在Nginx配置中,可以通过多种方式截取和处理URI。以下是几种常用的方法:

1. 使用正则表达式捕获组

location ~ ^/users/([^/]+)/profile$ {
    set $user_id $1;  # 捕获/users/<id>/profile中的<id>
    # 现在$user_id变量中存储了截取的部分
}

2. 使用rewrite指令截取

location /products/ {
    rewrite ^/products/([^/]+) /display_product.php?id=$1 last;
    # 将/products/123重写为/display_product.php?id=123
}

3. 使用map指令预处理

map $uri $product_id {
    ~^/products/(?<id>[^/]+) $id;
    default "";
}

server {
    location /products/ {
        # $product_id变量现在包含截取的ID部分
        proxy_pass http://backend/$product_id;
    }
}

4. 使用try_files结合变量

location ~ ^/images/(.*) {
    try_files /cache/$1 /originals/$1;
    # $1包含/images/之后的部分
}

5. 使用alias指令截取部分路径

location /static/ {
    alias /var/www/assets/;
    # 请求/static/js/app.js会映射到/var/www/assets/js/app.js
}

6. 使用$request_uri和$uri变量

location /api/ {
    set $api_path $request_uri;
    # 或者使用$uri获取规范化后的URI
}

高级示例:多段截取

location ~ ^/blog/([0-9]{4})/([0-9]{2})/([^/]+)$ {
    set $year $1;
    set $month $2;
    set $slug $3;
    # 现在可以分别访问$year, $month和$slug变量
}

注意事项

  1. 正则表达式location (~和~*)比前缀location (=和^~)有更高优先级
  2. 使用捕获组时,注意性能影响,特别是复杂的正则表达式
  3. 考虑使用^~修饰符来避免不必要的正则匹配
  4. 在rewrite规则中使用last标志会停止当前处理并重新开始location匹配

以上方法可以根据具体需求组合使用,实现灵活的URI处理和截取功能。