案例 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
- 目标:
- 组:
这仅仅是一个示例。您还可以创建多个规则来处理每个问题。这会简单得多。