Почему мой 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]

Но мой целевой URL на самом деле становится:

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 оставить эти коды в покое?

3
задан 1 October 2020 в 20:41
1 ответ

Поскольку %2 является обратной ссылкой в строках mod_rewrite substitution, это в противном случае ссылалось бы на второй захваченный подшаблон в последнем сопоставленном CondPattern . В опубликованном вами примере его нет, поэтому он заменен пустой строкой - так что он выглядит так, как будто он просто «разделен».

Для любой последовательности %n (где n равно 0-9) необходимо экранировать % обратной косой чертой, чтобы свести на нет его особое значение. т.е. \%20

Или используйте + вместо %20, чтобы избежать литеральных пробелов в строке запроса.

Вам понадобится флаг NE в RewriteRule, чтобы предотвратить двойное экранирование строки запроса. (Возможно, вам также следует использовать флаг L.)

2
ответ дан 1 October 2020 в 16:11

Теги

Похожие вопросы