Чтобы перенаправить запрос для /<something>%26<something>
на /<something>%2526<something>
, вы можете сделать что-то вроде следующего, используя mod_rewrite:
RewriteRule (.+)&(.+) /$1\%26$2 [R,L]
Шаблон RewriteRule
совпадает с% -декодированным URL-путем (т. Е. &
, а не %26
). Таким образом, вы должны просто указать &
(амперсанд) буквально. Обратите внимание, что это будет соответствовать запросу как /something_%26_else
, так и /something_&_else
(поскольку &
не нужно кодировать в запросе).
%
(проценты) в подстановке RewriteRule
необходимо экранировать обратной косой чертой, чтобы представить литерал %
, иначе он будет рассматриваться как обратная ссылка к последнему соответствует CondPattern , и его нет, поэтому %2
в противном случае станет пустой строкой!
По умолчанию, mod_rewrite автоматически URL-адрес кодирует URL-адрес замены, который на самом деле то, что мы хотим в этом случае: %26
получает (вдвойне) кодируется как %2526
.
Если вам конкретно нужна циклическая конструкция, если, например, %26
может встречаться в запрошенном URL более одного раза, тогда вы можете сделать что-то вроде следующего:
# 1. Looping construct to replace all "&" (decoded %26)
RewriteRule (.+)&(.+) $1\%26$2 [N,E=REPLACED:yes]
# 2. Finally redirect. Substitution is only URL-encoded at this stage.
RewriteCond %{ENV:REPLACED} yes
RewriteRule (.*) /$1 [R,L]
См. Также мой ответ на тот же вопрос в стеке Pro Webmasters для получения дополнительных объяснений и альтернатив: