Кодирование параметров строки запроса в IE10
Я получил запрос от клиента о том, что он хочет ввести строку запроса моей веб-службы с параметрами в адресной строке IE10 и получить результаты обслуживания. Параметры включают строку на иврите, например:
http://mywebsite.com/service.asmx/foo?param1=123¶m2=מחרוזתבעברית
Мне кажется, что IE10, в отличие от других (обычных) браузеров, не будет кодировать параметры строки запроса - каждый неанси-символ, который идет после? метка будет обращена к байту 3f, хотя он кодирует то, что идет до? mark - сам URL.
Например, если я пытаюсь достичь url (параметр мнимый, url нет, и у меня нет связи с сайтом)
http://www.shlomo.co.il/pageshe/sales/רכב-למכירה.asp?param=פאראם
и посмотрите в wirehark для байтов, которые я отправляю на сервер, он показывает мне
![wireshark output]()
Вы можете видеть, что он заменяет ивритную часть URL с помощью строки с urlencoded, но заменяет ивритские параметры с символами "3f".
Эта же строка в chrome будет закодирована в ней целиком:
GET http://www.shlomo.co.il/pageshe/sales/%D7%A8%D7%9B%D7%91-%D7%9C%D7%9E%D7%9B%D7%99%D7%A8%D7%94.asp?param=%D7%A4%D7%90%D7%A8%D7%90%D7%9D HTTP/1.1
Я попробовал это на машинах с win7/IE10 и winXPheb/IE8.
Мои настройки IE (особенно проверены параметр "Всегда показывать кодированные адреса", чтобы узнать, помогает ли он и перезагрузился, но не имеет значения):
![enter image description here]()
Я попытался найти информацию о проблеме, но не нашел ее.
Мои вопросы:
- Действительно ли это так, или я что-то упускаю?
- Является ли это поведение документированным где угодно?
- Существуют ли какие-либо настройки в IE/Win, которые разрешают кодирование параметров.
p.s. Конечно, если бы я разрабатывал client/web ui, я бы просто urlencode мой запрос, но мой запрос от клиента был точно, чтобы вставить запрос в адресную строку IE, поэтому меня интересует это конкретное поведение.
Спасибо.
Ответы
Ответ 1
Да, ваше наблюдение за поведением является точным. Internet Explorer 10 и ниже следуют сложному алгоритму кодирования URL-адреса. Это, как утверждается, было обновлено в Internet Explorer 11, но я обнаружил, что новый параметр не работает.
Параметр "Всегда показывать кодированные адреса" относится к тому, отображается ли PunyCode для имен узлов IDN и не влияет на строку запроса. Send UTF-8 URLs
в основном применяется к кодировке пути, хотя он также может влиять на другие кодеки
Поведение не полностью документировано нигде. Я хотел написать полную запись в своем блоге IEInternals об этом, но в итоге перешел от Microsoft до этого. Там частичное объяснение в этом сообщении в блоге.
Да, есть настройки, которые влияют на поведение. Флажок Send UTF-8 URLs
внутри "Инструменты" > "Свойства обозревателя" > "Дополнительно" - это одна из переменных, которая определяет, как отправляются URL-адреса, но опция не слепо делает то, что она подразумевает (только UTF-8 кодирует путь, а не строку запроса). Другие переменные включают:
- В случае ввода URL-адреса (например, адресная строка или "Пуск" > "Выполнить" и т.д.)
- Что такое системная кодовая страница ANSI (например, какой язык используется ОС по умолчанию)
- Кодовая страница загруженной страницы в браузере
Как следствие этих переменных, вы не можете надежно использовать URL-адреса, которые неправильно кодируются (например,% -escaped UTF8) в Internet Explorer.
Ответ 2
К сожалению, это все еще верно для Internet Explorer 11 (сборка 11.0.9600.17358, win7-x64)
Я видел, что вы не можете, к сожалению, изменить веб-сервер. Однако те, кто разрабатывает новые службы, могут рассмотреть возможность изменения параметров запроса в переменных пути, например. от http://myserver.com/page? τεστ в http://myserver.com/τεστ/
Ответ 3
Если клиент вызывает веб-сервис из javascript,
encodeuricomponent
. В вашем случае encodeuricomponent("מחרוזתבעברית");
http://www.w3schools.com/jsref/jsref_encodeURIComponent.asp