Nginx中去除URL前缀的核心方法是正确使用proxy_pass末尾斜杠:不带/则保留前缀,带/则自动剥离location匹配的前缀路径并转发剩余部分。

可以使用 NJS(NGINX JavaScript)在 NGINX 配置中编写轻量、安全的自定义逻辑,实现对请求 URI 或 Header 中特定前缀的动态识别与剔除。关键在于利用 NJS 模块操作字符串、正则匹配,并结合 NGINX 的变量机制将处理结果透传给后端或重写流程。
明确剔除目标与触发条件
先确定“特定前缀”的形式(如 /v1/api/、X-Api-Version: v2 或 token=abc123_),以及剔除发生的阶段(请求入口?转发前?响应头处理?)。NJS 通常在 access_by_lua_block 类似位置执行,但 NJS 使用 js_access 或 js_set 更原生、更高效。
- 若处理 URI:用
r.uri获取原始路径,用.replace()或.substring()剔除前缀 - 若处理 Header:用
r.headersIn['X-Custom-Prefix']读取,再按需截断 - 避免全局替换,建议用精确正则(如
^\/v\d+\/api\/)防止误删
编写 NJS 函数实现动态剔除
在 nginx.conf 的 http 块中定义 NJS 函数,例如:
基于三引擎设计,从微信文章、新闻和博客网页提取干净内容,支持标题作者日期元数据,多格式和批量处理。
js_import utils.js; js_set $clean_uri utils.stripPrefix;
对应 utils.js 文件内容:
function stripPrefix(r) {
const uri = r.uri;
// 匹配形如 /v[数字]/ 开头的前缀,最多保留一级版本前缀
const match = uri.match(/^\/v\d+\/(.*)$/);
if (match && match[1]) {
return '/' + match[1]; // 剔除 /v1/,返回 /api/users
}
return uri;
}
export default { stripPrefix };
- 函数必须接收
r(request 对象)作为唯一参数 - 返回值会赋给 NGINX 变量(如
$clean_uri),可用于rewrite或proxy_pass - 支持嵌套逻辑:例如先判断 header 中是否含
strip=true,再决定是否执行剔除
在 location 中集成并生效
将 NJS 处理结果用于实际转发或重写:
location / {
js_access utils.stripPrefix; # 可选:做访问控制级干预
rewrite ^(.*)$ $clean_uri break;
proxy_pass http://backend;
proxy_set_header X-Original-Uri $uri;
}
- 用
rewrite ... break确保内部重写不触发外部跳转 - 通过
proxy_set_header透传原始或清洗后信息,便于后端日志或路由判断 - 若需条件启用(如仅对 mobile 端剔除),可在 NJS 函数中检查
r.headersIn['User-Agent']
验证与调试技巧
NJS 不支持 console.log,但可通过 r.warn() 和 error_log 输出调试信息:
function stripPrefix(r) {
r.warn('Processing URI: ' + r.uri);
// ... logic
r.warn('Cleaned URI: ' + result);
return result;
}
- 确保
error_log /path/error.log notice;,查看 warn 级日志 - 用
curl -v http://localhost/v2/api/test验证响应头与后端收到的路径 - 注意 NJS 是同步执行,避免耗时操作(如网络请求、大文件读取)

















