Auto route - 508364/NetLeaf GitHub Wiki
Auto-route 模块
概述
Auto-route 模块是从 NetLeaf 主库分离出来的独立库,用于在404错误时自动查找相近的路由端点并在错误页面提示用户。
版本: 与主库共用版本号
平台支持:
- ✅ Windows
- ✅ Linux
- ✅ macOS
功能特性
1. 智能路由匹配
使用Levenshtein距离算法计算路径相似度,支持多策略评分:
- 路径段匹配: 逐个比较路径段的相似度
- 前缀共有: 如果前缀相同给予额外加分
- 段数相同: 如果路径段数相同给予额外加分
2. 路由建议
当用户访问不存在的路径时,自动查找最相似的现有路由并给出建议:
404 - Not Found
您访问的路径 "/api/user" 不存在。
您可能在找: /api/users
3. 灵活启用方式
支持多种启用/禁用方式:
- 整数:
1(启用),0(禁用) - 字符串:
"true","false","on","off","yes","no"(大小写不敏感)
4. 通配符支持
支持路由模式匹配:
*- 匹配任意字符(不包含/)**- 匹配路径段
API 参考
初始化与配置
| 函数 | 说明 |
|---|---|
nl_autoroute_init() |
初始化模块 |
nl_autoroute_is_available() |
检查模块是否可用 |
nl_autoroute_version() |
获取模块版本 |
启用/禁用
| 函数 | 说明 |
|---|---|
nl_autoroute_enable(int) |
启用/禁用模块(整数) |
nl_autoroute_enable_ex(const char*) |
启用/禁用模块(字符串) |
nl_autoroute_is_enabled() |
检查模块是否启用 |
路由匹配器
| 函数 | 说明 |
|---|---|
nl_route_matcher_create() |
创建路由匹配器 |
nl_route_matcher_add_route() |
添加单个路由 |
nl_route_matcher_add_routes() |
批量添加路由 |
nl_route_matcher_destroy() |
销毁匹配器 |
查找相似路由
| 函数 | 说明 |
|---|---|
nl_route_matcher_find_similar() |
查找相似路由(返回最佳匹配) |
nl_route_matcher_get_suggestions() |
获取多个建议 |
相似度计算
| 函数 | 说明 |
|---|---|
nl_route_similarity() |
计算两个路径的相似度 |
nl_levenshtein_distance() |
计算Levenshtein距离 |
辅助函数
| 函数 | 说明 |
|---|---|
nl_find_best_route() |
从路由列表中查找最佳匹配 |
nl_route_matches() |
检查路由模式是否匹配路径 |
全局匹配器
| 函数 | 说明 |
|---|---|
nl_autoroute_get_global_matcher() |
获取全局路由匹配器 |
nl_autoroute_set_global_matcher() |
设置全局路由匹配器 |
nl_autoroute_discover_routes() |
自动发现路由 |
使用示例
#include "netleaf_autoroute.h"
int main() {
// 初始化模块
nl_autoroute_init();
// 启用模块
nl_autoroute_enable_ex("true");
// 获取全局路由匹配器
nl_route_matcher_t* matcher = nl_autoroute_get_global_matcher();
// 添加已知路由
nl_route_matcher_add_route(matcher, "/api/users");
nl_route_matcher_add_route(matcher, "/api/products");
nl_route_matcher_add_route(matcher, "/dashboard");
nl_route_matcher_add_route(matcher, "/login");
// 查找相似路由
char* suggestion = nl_route_matcher_find_similar(matcher, "/api/user", 0.4);
// suggestion: "/api/users" (相似度0.75)
// 获取多个建议
nl_route_suggestion_t suggestions[5];
int count = nl_route_matcher_get_suggestions(matcher, "/api/usre", suggestions, 5);
free(suggestion);
return 0;
}
相似度算法
算法说明
相似度评分由以下三部分组成:
- 段平均相似度 (60%): 计算每个路径段的Levenshtein距离,取平均值
- 段数相同奖励 (20%): 如果两个路径段数相同,给予额外加分
- 前缀相同奖励 (20%): 如果路径前缀相同,给予额外加分
评分公式
score = avg_seg_sim * 0.6 + seg_count_bonus + prefix_bonus
示例
| 目标路径 | 候选路径 | 相似度 |
|---|---|---|
/api/user |
/api/users |
0.75 |
/api/usre |
/api/users |
0.72 |
/api/products |
/api/product |
0.75 |
/dashboard |
/dashbord |
0.85 |
/login |
/log |
0.55 |
路由匹配模式
通配符说明
| 模式 | 说明 | 示例 |
|---|---|---|
* |
匹配任意字符(不包含 /) |
/api/* 匹配 /api/users |
** |
匹配任意路径段 | /** 匹配所有路径 |
使用示例
// 匹配所有API路径
nl_route_matches("/api/**", "/api/users/123"); // 返回 1
// 匹配任意子路径
nl_route_matches("/admin/*", "/admin/profile"); // 返回 1
// 精确匹配
nl_route_matches("/login", "/login"); // 返回 1
编译选项
BUILD_AUTOROUTE=ON # 默认启用
与ErrorPage模块联动
Auto-route模块可以与ErrorPage模块联动,在404错误页面中显示路由建议:
// 在错误处理中
char* suggestion = nl_route_matcher_find_similar(matcher, requested_path, 0.4);
nl_errorpage_vars_t vars = {
.status_code = 404,
.error_message = "Not Found",
.requested_path = requested_path,
.suggestion = suggestion, // 传递建议
.server_version = "NetLeaf v2.4.0"
};
char* response = nl_errorpage_make_response(404, &vars);
free(suggestion);
注意事项
- 该模块是独立库,可以单独编译和加载
- 如果模块未加载,路由建议功能不可用,但不会影响主库运行
- 建议在服务器启动时注册所有路由
- 相似度阈值建议设置为0.4-0.6之间