У меня есть пользователь, который получает ошибку из-за вызовов ajax на нашем сайте.
Ошибка вставлена ниже.
Они получают ошибку в FF3 Windows, но не в IE.
На основании некоторого поиска кажется, что эта проблема часто вызвана клиентским протоколом squid (вы заметите, что в конце ошибки упоминается squid).
Мой код ajax здесь тот же: http://www.w3schools.com/Ajax/ajax_browsers.asp
Есть идеи?
ERROR
The requested URL could not be retrieved
While trying to process the request:
POST /library/cart/cart_ajax.php?action=refreshCartWidget&qty=dontuse& HTTP/1.1
Host: mydomain.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: identity,gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: Close
Referer: http://mydomain.com/library
Pragma: no-cache
Cache-Control: no-cache
The following error was encountered:
Invalid Request
Some aspect of the HTTP Request is invalid. Possible problems:
Missing or unknown request method
Missing URL
Missing HTTP Identifier (HTTP/1.0)
Request is too large
Content-Length missing for POST or PUT requests
Illegal character in hostname; underscores are not allowed
Your cache administrator is webmaster.
Generated Wed, 12 Nov 2008 09:28:58 GMT by ipwal3.osi-tech.com (squid/2.6.STABLE17)





Сэкономьте время и используйте jQuery. У него есть абстракция для ajax, которая работает во всех браузерах, а не только в Internet Explorer и, возможно, в FF. ;-) Я предполагаю, что код там старый и долгое время не обновлялся.
Простой вызов ajax в jQuery выглядит следующим образом:
$.post(
'/the/url/to/post/to',
{ some: data },
function(data) { alert(data); }
);
Также полезно, если вы понимаете основы HTTP - например, методы запроса (PUT, POST, GET, DELETE, HEAD) и так далее. Вставленная ошибка означает, что заголовок Content-Length отсутствует в вашем запросе, и большинство серверов (если не все) ожидают, что он будет отправлен, когда вы выдадите PUT или POST, потому что предполагается, что они «изменяют данные» (например, создают, обновляют).
Возможно, IE добавляет за вас заголовок, но Firefox явно не делает этого.
Обо всем этом позаботится jQuery. ;)
Вы можете использовать .setRequestHeader () в своем XHR-объекте, чтобы установить длину содержимого, если FF не делает этого за вас.
Поскольку вы публикуете свои данные в методе .send (content), просто добавьте перед ним заголовок с content.length.
Вы должны сесть вместе со своим пользователем и поместить инструмент трассировки HTTP Скрипач между ними. Затем вы можете легко сравнить запрос, отправляемый IE и FF3.
Таким образом, должно стать видно, где есть различия и почему они вызывают проблемы.
Я считаю, что вам нужно указать Content-Length или использовать кодирование передачи по частям с HTTP / 1.1. В противном случае вы не можете использовать keep-alive, и, очевидно, просто указать «Connection: close» недостаточно. Но да, обо всем этом так много раз позаботились в товарных библиотеках, так что лучше воспользоваться этим.