Конфликт с squid и ajax

У меня есть пользователь, который получает ошибку из-за вызовов 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)
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
2 780
3

Ответы 3

Сэкономьте время и используйте 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. ;)

Я считаю, что вам нужно указать Content-Length или использовать кодирование передачи по частям с HTTP / 1.1. В противном случае вы не можете использовать keep-alive, и, очевидно, просто указать «Connection: close» недостаточно. Но да, обо всем этом так много раз позаботились в товарных библиотеках, так что лучше воспользоваться этим.

araqnid 21.04.2009 16:13

Вы можете использовать .setRequestHeader () в своем XHR-объекте, чтобы установить длину содержимого, если FF не делает этого за вас.

Поскольку вы публикуете свои данные в методе .send (content), просто добавьте перед ним заголовок с content.length.

Вы должны сесть вместе со своим пользователем и поместить инструмент трассировки HTTP Скрипач между ними. Затем вы можете легко сравнить запрос, отправляемый IE и FF3.

Таким образом, должно стать видно, где есть различия и почему они вызывают проблемы.

Другие вопросы по теме