Заменить% 26 в htaccess на% 2526 - PullRequest
       26

Заменить% 26 в htaccess на% 2526

2 голосов
/ 23 октября 2010

Я импортирую кучу страниц с амперсандами в заголовке из Mediawiki. Они кодируются как %26. Drupal по разным причинам решил дважды закодировать URL, чтобы он стал %2526. Я просто не могу создать alaises в Drupal, поэтому мне нужно использовать htaccess.

Мне нужно example.com/something_%26_else, чтобы стать example.com/something_%2526_else. Это то, что я имею, как правило, до сих пор:

RewriteRule ^w/([^%26]+)\%26(.*)$ w/$1\%2526$2 [R=301]

Я ценю помощь.

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Чтобы перенаправить запрос для /<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 для получения дополнительных объяснений и альтернатив:

0 голосов
/ 04 февраля 2011

Попробуйте использовать механизм 'look-behind' с RewriteCond и флагом NEXT, чтобы перебрать URI и изменить% 26 на% 2526:

RewriteCond "\%(?<=25)26"
RewriteRule "^(w/.*)\%(?<=25)(26.*)" "$1\%25$2" [N]
...