为什么我的 Apache RewriteRule 会从目标 url 查询字符串中删除十六进制代码?

为什么我的 Apache RewriteRule 会从目标 url 查询字符串中删除十六进制代码?

我有一个 apache 重写规则:

RewriteRule ^/xy[/]{0,1}$ https://www.example.com/path/file.php?utm_source=Billboard&utm_medium=Print&utm_campaign=MyOrg%20Promo&utm_term=2020FA&utm_context=XY%2C%20border%20state%20abbreviation%20redirect [R]

但我的目标网址实际上变成了:

https://www.example.com/path/file.php?utm_source=Billboard&utm_medium=Print&utm_campaign=MyOrg0Promo&utm_term=2020FA&utm_context=XYC0border0state0abbreviation0redirect

因此,它会剥离%2目标查询字符串中的十六进制代码部分。

我尝试设置 PT、B、NE、QSD 和 BNP 标志。我使用的是 Apache 2.4.6(CentOS),但不支持 BNP 标志。

我怎样才能让 Apache 不再管这些代码呢?

答案1

因为%2反向引用在 mod_rewrite 中代换字符串,否则将引用最后匹配的第二个捕获的子模式条件模式。您发布的示例中没有,因此将其替换为空字符串 - 因此看起来它只是被“剥离”了。

对于任何序列%n(其中n为 0-9),您需要使用反斜杠转义来%否定其特殊含义。例如。\%20

或者,使用+而不是 来%20转义查询字符串中的文字空格。

您将需要NE标志来RewriteRule防止查询字符串被双重转义。(并且您可能L也应该使用该标志。)

相关内容