Orbit

配置重定向和重写

Orbit has a built-in redirect and rewrite engine that runs before your project is asked for anything, configured either in KPanel or as a file in your repository. This guide covers both, the pattern…

Orbit 拥有一个内置的重定向和重写引擎,在向您的项目请求任何内容之前运行,可以在 KPanel 中或作为存储库中的文件进行配置。本指南涵盖了两种方式、模式语法及其捕获、规则顺序、限制以及容易引起困惑的行为。

配置规则的位置

有两个地方,它们按固定顺序进行评估。

  1. 在 KPanel 中。Orbit 中打开您的项目,转到 Settings,然后向下滚动到该环境的 redirects and rewrites 部分。每个环境都有自己独立的一组规则,因此生产环境和预发布环境需要分别配置。
  2. 在您的存储库中,作为 kaps.json 文件。下文将进一步介绍此内容。

面板规则首先进行评估。如果没有规则匹配,则尝试 kaps.json 规则。

Orbit 项目设置中的重定向和重写部分

在 KPanel 中添加规则

  1. 点击 Add rule
  2. 填写 source,即与传入请求匹配的路径模式。占位符显示它期望的两种形式:/old-path or /blog/:slug
  3. 填写 destination。占位符显示 /new-path or https://...,因此本地路径和完整的外部 URL 都有效。
  4. 选择规则类型:
    • 301 Permanent:URL 已永久移动。浏览器和搜索引擎会缓存此项。
    • 302 Temporary:暂时移动,不会缓存。用于活动和实验。
    • Rewrite:提供目标路径,而不更改浏览器地址栏中的 URL。
  5. 点击 Save rules

规则从 next deployment 生效,不会立即生效。保存规则不会改变当前实时部署提供的内容。保存后重新部署,否则您的规则看起来将无法正常工作。

301 会被浏览器缓存,有时会缓存很长时间,您无法从服务器端清除它。如果您不确定移动是否永久,请先使用 302,然后在确认后切换到 301。在高流量路径上出错真的很难挽回。

源路径模式

模式匹配捕获
/old-page完全匹配 /old-page
/blog/*任何以 /blog/ 开头的内容路径的其余部分,在目标中引用为 *
/posts/:id/posts/ 加上一个路径段该段,作为 :id
/files/:rest*/files/ 加上其后的所有内容,包括斜杠整个剩余部分,作为 :rest

:id:rest* 之间的区别是重要的。命名参数匹配 single segment,在下一个斜杠处停止。splat 匹配 everything remaining,包括斜杠。

在目标中使用捕获

按名称引用命名参数,将裸通配符引用为 *

目标结果
/blog/:slug/articles/:slug/blog/hello-world 变成 /articles/hello-world
/docs/:rest*/help/:rest*/docs/a/b/c 变成 /help/a/b/c
/old/*/new/*/old/a/b 变成 /new/a/b

规则顺序

规则从列表顶部向下测试,first match wins。一旦规则匹配,就不考虑后面的规则。面板在列表下方显示:"Rules are tested in order. First match wins."

将特定规则放在通用规则之上。放在 /blog/* 上方的 /blog/2023/:slug 规则将吞掉更特定规则本应处理的每一个请求,这看起来就像特定规则根本坏了一样。

如果没有规则匹配,请求将正常提供。

常见用例

重命名页面

您将 /about-us 重命名为 /about,并希望旧链接继续工作。

  • 源:/about-us
  • 目标:/about
  • 类型:301 Permanent

移动整个部分

您的博客从 /news/:slug 移动到 /blog/:slug

  • 源:/news/:slug
  • 目标:/blog/:slug
  • 类型:301 Permanent

静默代理 API 路径

您想要 /api/v1/* 从不同的内部路径提供,而不暴露此更改。

  • 源:/api/v1/:path*
  • 目标:/api/internal/:path*
  • 类型:Rewrite

临时占位符页面

  • 源:/checkout
  • 目标:/maintenance
  • 类型:302 Temporary

将流量发送到另一个域

目标可能是绝对 URL,因此规则可以指向完全不同的站点。

  • 源:/shop/:rest*
  • 目标:https://shop.example.com/:rest*
  • 类型:301 Permanent

使用 kaps.json 作为代码的配置

规则可以存在于您的存储库中而不是面板中。添加 kaps.json 文件,并确保您的构建将其复制到 output directory,因为 Orbit 从构建工件的根目录而不是存储库根目录读取它。

{
  "redirects": [
    { "source": "/about-us", "destination": "/about", "permanent": true },
    { "source": "/news/:slug", "destination": "/blog/:slug", "permanent": true },
    { "source": "/promo", "destination": "/spring-sale", "permanent": false }
  ],
  "rewrites": [
    { "source": "/api/v1/:path*", "destination": "/api/internal/:path*" }
  ],
  "headers": [
    {
      "source": "/*",
      "headers": [
        { "key": "X-Frame-Options", "value": "DENY" },
        { "key": "X-Content-Type-Options", "value": "nosniff" }
      ]
    }
  ]
}

permanent: true 产生 301,permanent: false 产生 302。省略它会产生 301。

kaps.json 仅适用于 static deployments。如果 Server mode 打开,您的应用处理自己的路由,该文件将被忽略。它也仅在环境的面板规则无法匹配后进行评估,因此对于同一路径,面板规则始终优于文件规则。

当规则属于代码时使用 kaps.json,以便在拉取请求中审查它们并随着回滚一起移动。当您需要规则立即生效而不需要部署时,使用面板。不要在两个地方维护相同的规则:面板规则将始终赢,文件规则将看起来被忽略了,事实上它确实被忽略了。

限制

  • 每个环境最多 100 条重定向和重写规则,kaps.json 中最多 100 条。
  • 每个环境最多 200 条自定义头规则。

超过限制的规则会被静默删除,而不会引发错误,因此请远远低于限制。

自定义响应头

除了重定向外,每个环境在 Settings 中都有一个响应头部分,用于在匹配的路径上注入 HTTP 头。它使用相同的路径模式语法,并为 HSTS、CSP、no-embed、no-sniff、referrer policy 和 CORS 提供快速添加预设。

与重定向不同,all 匹配的头规则都会应用,而不仅仅是第一条,当后面的规则设置相同的头时,它会覆盖前面的规则。Content-LengthTransfer-EncodingConnection 被阻止,因为设置它们会破坏响应。

在依赖前值得了解的行为

Query strings 不会跨重定向传递。 无论请求是否有查询字符串,规则都会匹配,但目标仅从您的模板和捕获的路径段构建。对 /old?utm_source=email 的请求重定向到 /new,参数被删除。如果您依赖追踪参数保留,则改为在边缘函数中处理重定向,您可以完全控制目标 URL。

  • 规则仅匹配路径。 Fragment(#section)根本不会到达服务器;浏览器在重定向后会重新附加它们。
  • 重写到不存在的路径会产生 404,而不是静默回退到原始路径。重写目标必须存在于您的构建输出中。
  • 规则在向您的项目请求任何内容之前运行,因此它们适用于静态文件和服务器模式请求。
  • 每个环境是独立的。 生产环境上的规则不适用于预发布环境或预览。有目的地复制它们。

删除规则

点击规则行上的垃圾图标,然后点击 Save rules 以应用更改。与添加一条规则一样,更改从下一次部署生效。

何时使用边缘函数

重定向引擎处理路径到路径的规则。当您需要规则引擎无法表达的逻辑时,请使用 edge function:基于头或 cookie 的分支、保留或重写查询参数、加权 A/B 路由或任何条件逻辑。

相关阅读

仍需帮助?

请发送邮件至 support@kapsulehost.com 或在 KPanel 中打开聊天。

打开 KPanel
配置重定向和重写