跳到主要内容

案例 3:向 URL 添加查询参数

假设有一个名为 example.com 的网站默认显示移动布局,但您更喜欢其桌面布局。幸运的是,该网站支持 layout 查询参数来指定网站显示的布局。让我们创建一个自动添加 layout=desktop 的规则。

也许您认为可以将其定义如下:

  • 重定向自https://example.com/.*(正则表达式)
  • 重定向到$0?layout=desktop

$0 引用目标 URL。如果您尝试访问 example.com/hello,您将被重定向到 example.com/hello?layout=desktop。此功能称为替换

提示

替换也适用于通配符模式,因为它在内部转换为正则表达式。

但是,这些设置存在一些问题。

问题 1:无限循环

当前设置会创建无限重定向循环,因为 https://example.com/.* 也针对 https://example.com/hello?layout=desktop

在这种情况下,您可以指定一个排除的 URL 模式,允许您在不重定向的情况下访问,例如使用正则表达式:

.*[&?]layout=[^&]*.*
  • .*:匹配任何内容
  • [&?]:匹配 &?
  • [^&]*:匹配除 & 之外的任何内容

问题 2:无法正确处理现有参数

如果目标 URL 已经有其他查询参数,例如 example.com/hello?theme=dark,则目标将是 example.com/hello?theme=dark?layout=desktop(URL 中有两个 ?),但您只能使用 & 连接参数。? 作为特殊字符只允许在参数开头。因此它不被视为有效参数。

在这种情况下,请按如下方式更改设置:

  • 重定向自(https://example.com/[^?]*)(\?(.*))?
  • 重定向到$1?layout=desktop&$3

让我们一步一步地看一下。

  • (https://example.com/[^?]*):匹配直到 ? 前一个字符的部分。
    • [^?]* 匹配除 ? 之外的任何内容。
    • 这用 () 括起来,因此您以后可以使用 $1 引用它。
  • (\?(.*))?:匹配以 ? 开头的字符串,这意味着查询参数。
    • 这也通过模式末尾的 ? 量词匹配空字符串,该量词匹配零次或一次
    • 外部 () 和内部 () 以后可以使用 $2$3 引用。

RegExr 可能会帮助您理解详细信息。

备注

当您不使用 \ 转义 / 时,RegExr 会显示错误。尽管您可以转义它,但这不是必需的,因为 Redirect Web 使用 Apple 的不同引擎,不需要转义。

这不是一个完美的解决方案,因为它将 example.com/hello 重定向到 example.com/hello?layout=desktop&,其中 URL 末尾包含一个不必要的 &。通常这不是什么大问题,但如果您希望删除它,可以使用捕获组处理

总之,这是最终输出:

  • 重定向自(https://example.com/[^?]*)((\?(.*))?)(正则表达式)
  • 重定向到$1?layout=desktop$3
  • 排除的 URL 模式.*[&?]layout=[^&]*.*(正则表达式)
  • 捕获组处理
    • $3
    • 过程:替换出现次数
      • 目标\?(.*)
      • 替换&$1

⬇️ 下载规则

这仅仅是一个示例。您还可以创建多个规则来处理每个问题。这会简单得多。