Просматривая логи моего веб-сервера, я вижу, что некоторые из отправляемых AJAX-запросов повторно закодированы в некоторых браузерах (или прокси в пути ??):
Исходный запрос (которыйотправляется корректно большинством браузеров: GET / somedir / 3 & 4 = 100 & z = 3 HTTP / 1.1
Но в некоторых случаях (которые агентом пользователя я могу связать только с вышеупомянутыми браузерами)) запросы отправляются как: GET / somedir / 3% 264 = 100% 26z = 3 HTTP / 1.1
По какой-то причине знак амперсанда кодируется после того, как я передал информацию в объект XMLHttpRequest.
Вот код, который я использую:
var data = document.location.href + params.command; // single character, alphanumeric
if ( typeof( params.param ) != "undefined" )
{
data += '=' + encodeURIComponent( params.param );
}
data += "&0" + "=" + this.someNum + "&z=" + ( this.requestNum++ );
xhr.open( "GET", data, true );
xhr.setRequestHeader( "Cache-Control", "no-cache" );
xhr.onreadystatechange = handleResponse; // Defined elsewhere
if ( xhr.overrideMimeType )
{
xhr.overrideMimeType( "text/plain" );
}
xhr.send( null );
Некоторые замечания:
- Запросы всегда являются запросами GET.
- Параметры отправляются какстрока запроса (name1 = val1 & name2 = val2 и т. д.) без начального вопросительного знака ('?').
- Имена параметров буквенно-цифровые ([a-z0-9]).
- Значения параметров всегда encodeURIComponent () - ed (когда значение не является числовым).
- Иногда запросы отправляются в виде HTTP / 1.0 (я думаю, что это прокси-объект ...).
- Строки user-agent, которые соответствуют этой проблеме:
Mozilla / 4.0 (совместимо;MSIE 8.0;Windows NT 5.1;Trident / 4.0;.NET CLR 2.0.50727;.NET CLR 3.0.04506.648;.NET CLR 3.5.21022;.NET CLR 3.0.4506.2152;.NET CLR 3.5.30729;InfoPath.2)
Mozilla / 5.0 (Windows; U; en_US) AppleWebKit / 530.19.2 (KHTML, как Gecko) Dreamweaver / 11.0.0.4909 версия / 4.0.2 Safari / 530.19.2
Решено: Моя проблема заключалась в том, что я не использовал символ строки запроса ('?'), Пытаясь сохранить символ в сообщениях ... как только я добавил знак вопроса, а URL-адреса выглядели так: domain.com/? param = value¶m2 = value все работает.Похоже, пропуск этого символа может привести к тому, что некоторые браузеры / прокси-серверы начнут думать, что param = value¶m2 = value является частью запрошенного имени страницы и, следовательно, экранирует символы '&'.