Мне это нужно, потому что Internet Explorer не принимает этот специальный символ, другие браузеры.
Если бы IE «не принимал этот специальный символ», то, вероятно, было бы немногоВы могли бы сделать (как отмечено в моем комментарии).Однако в моих тестах на IE11 кажется, что IE "просто" не является URL, кодирующим символ ®
при выполнении запроса * 1 .Другие браузеры помогают и «исправляют» URL, кодируя этот символ как %C2%AE
как часть запроса.
(* 1 , хотя, еслизапрос обновлен в IE, тогда IE, кажется, заменяет символ ®
вместо U + FFFD «Символ замены» - несмотря на то, что инструменты разработчика показывают символ ®
?!)
Если запрос достигает вашего сервера, это можно исправить.(Хотя запрос является строго недействительным.)
Если запрос достигает вашего приложения, вы также должны иметь возможность обрабатывать это в самом коде приложения - но, возможно, у вас нет контроля над этим?
Попробуйте что-то вроде следующего в верхней части вашего .htaccess
файла, чтобы «перенаправить» (не «переписать») запрос, если он содержит незашифрованный символ ®
в части строки запроса запрошенного URL, заменив этос %C2%AE
в ответе о перенаправлении:
RewriteEngine On
RewriteCond %{QUERY_STRING} (.+)®(.*)
RewriteRule ^training/some-training/subscribe/$ /$0?%1\%C2\%AE%2 [R,L,NE]
Символ ®
может быть представлен буквально в CondPattern .
$0
является обратной ссылкой навесь URL-путь - для сохранения ввода.
%1
и %2
являются обратными ссылками на строку до и после символа ®
.
\%C2\%AE
- обратите внимание на обратную косую чертуэкранировал %
символов для представления буквального %
, чтобы избежать путаницы с обратными ссылками вида %n
.(Хотя в этом случае все должно быть в порядке, лучше быть явным.)
Флаг NE
(noescape
) предотвращает двукратное кодирование строки susbstitution .
желательно, чтобы его нужно было переписать только в Internet Explorer
Казалось бы, только IE отправляет этот символ в незашифрованном виде.Но вам, вероятно, нужно было бы закодировать этот символ независимо от браузера, поскольку, по-видимому, ваше приложение ломается из-за него?
ОБНОВЛЕНИЕ: ... Теперь это 'training / some-training / subscribe / ', но URL не всегда содержит этот текст, это может быть что угодно.
Если URL-путь может быть что угодно , тогда пустьоно соответствует что-нибудь :
RewriteCond %{QUERY_STRING} (.+)®(.*)
RewriteRule .* /$0?%1\%C2\%AE%2 [R,L,NE]
Однако лучше использовать как можно более строгие ограничения, поскольку теперь это будет обрабатываться при каждом запросе.
не должен ли символ, который нужно переписать (®) в первой части после RewriteRule?
шаблон RewriteRule
(первый аргумент директивы RewriteRule
) соответствоватьтолько для URL-пути - это, в частности, исключает часть строки запроса URL-адреса.Вот почему нам нужно использовать дополнительную директиву RewriteCond
( условие ) для проверки (и перехвата) части URL-адреса строки запроса.