2008-11-12 13 views
0

J'ai un utilisateur qui obtient une erreur d'appels ajax sur notre site.Conflit avec squid et ajax

L'erreur est collée ci-dessous.

Ils obtiennent l'erreur dans Windows FF3, mais pas IE. En fonction de certaines recherches, il semble que ce problème soit souvent causé par le calamar du protocole client (vous remarquerez à la fin de l'erreur que squid est mentionné).

Mon code ajax est le même utilisé ici: http://www.w3schools.com/Ajax/ajax_browsers.asp

Toutes les idées?

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) 

Répondre

2

Épargnez-vous du temps et utilisez jQuery. Il a une abstraction pour ajax, qui fonctionne dans tous les navigateurs et pas seulement Internet Explorer, et peut-être FF. ;-) Je suppose que le code là-bas est ancien et n'a pas été mis à jour depuis longtemps.

Un simple appel ajax jQuery est la suivante:

$.post(
    '/the/url/to/post/to', 
    { some: data }, 
    function(data) { alert(data); } 
); 

Il aide également si vous comprenez les bases de HTTP - par exemple, les méthodes de demande (PUT, POST, GET, DELETE, HEAD) et bientôt. L'erreur que vous avez collée signifie que l'en-tête Content-Length manque à votre requête et la plupart des serveurs (sinon tous) attendent qu'elle soit envoyée lorsque vous émettez PUT ou POST parce que ceux-ci sont supposés être des "données" (par exemple créer, mettre à jour).

Peut-être que IE ajoute l'en-tête pour vous, mais Firefox ne semble pas.

jQuery prend soin de tout cela. ;)

+0

Eh bien, vous devez spécifier Content-Length ou utiliser le codage de transfert en bloc avec HTTP/1.1, je crois. Sinon, vous ne pouvez pas utiliser keep-alive, et il suffit simplement de spécifier "Connection: close". Mais oui, tout cela a été pris en compte tellement de fois dans les bibliothèques de produits de base, donc mieux profiter de cela. – araqnid

1

Vous pouvez utiliser .setRequestHeader() sur votre objet XHR pour définir une longueur de contenu si FF ne le fait pas pour vous.

Puisque vous publiez vos données dans la méthode .send (content), ajoutez simplement un en-tête avant celui avec content.length.

0

Vous devez vous asseoir avec votre utilisateur et placer l'outil de suivi HTTP Fiddler entre les deux. Ensuite, vous pouvez facilement comparer la demande envoyée par IE et FF3. De cette façon, il devrait devenir visible là où les différences sont et pourquoi elles causent des problèmes.