Vercel 的 rewrites 在这两种情况下的行为是不同的:

---

### 情况一:静态路径重写 (没有使用正则表达式捕获)

这是您最开始的例子:

"rewrites": [
  {
    "source": "/w",
    "destination": "/api/index"
  }
]


* 行为: 这种配置像一个**别名**。你告诉 Vercel:“/w 这个路径就是 /api/index 的一个别名”。
* `request.url`: 当请求到达时,Vercel 查找这个别名,然后把请求完全交给 /api/index 处理。此时,对于 api/index 函数来说,它看到的 request.url 就是它自己的地址:`/api/index`。原始的 /w 在这个阶段已经被“翻译”掉了。

---

### 情况二:动态路径重写 (使用正则表达式捕获)

这是您的第二个例子:

"rewrites": [
  {
    "source": "/(.*)",
    "destination": "/api/index.js"
  }
]


* 行为: 这种配置像一个**前端控制器**或**网关**。`/(.*) 中的 (.*) 是一个正则表达式的“捕获组”,它会捕获所有传入的路径。你告诉 Vercel:“无论用户访问什么路径,都把它捕获下来,然后交给 /api/index.js` 这个函数去处理”。
* `request.url`: 为了让 /api/index.js 能正确处理请求(例如,根据 URL 显示不同的页面内容),Vercel 必须把**原始捕获到的路径**告诉它。因此,在这种情况下,函数内部拿到的 request.url **就是用户访问的原始 URL**。

---

### 总结

| source 的写法 | 行为模式 | 函数收到的 request.url |
| :----------------------- | :------------- | :------------------------ |
| "/w" (静态路径) | 别名 (Alias) | "/api/index" (目标地址) |
| "/(.*)" (动态正则捕获) | 网关 (Gateway) | "/w" (原始请求地址) |



#programming
 
 
Back to Top