2010-05-01 5 views
2

Я чувствую себя совершенно глупо, потому что я потратил два часа на решение задачи, которая должна быть очень простой и которую я решал много раз раньше. Но теперь я даже не уверен, в каком направлении копать.пустое тело ответа в ajax (или 206 частичное содержание)

Я не могу получить статический контент с помощью ajax с локальных серверов (Apache и Mongrel). Я получаю ответы 200 и 206 (в зависимости от сервера), пустой текст ответа (хотя заголовок Content-Length всегда правильный), firebug показывает запрос красным цветом.

Javascript является очень общим, я получаю те же результаты, даже здесь: http://www.w3schools.com/ajax/tryit.asp?filename=tryajax_first (просто изменить расположение документа на «http://localhost:3000/whatever») Таким образом, это, вероятно, не является причиной.

Ну, теперь у меня нет идей. Я также могу опубликовать http-заголовки, если это поможет.

Спасибо!

Response Headers 
Connection close 
Date Sat, 01 May 2010 21:05:23 GMT 
Last-Modified Sun, 18 Apr 2010 19:33:26 GMT 
Content-Type text/html 
Content-Length 7466 

Request Headers 
Host localhost:3000 
User-Agent Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language en-us,en;q=0.5 
Accept-Encoding gzip,deflate 
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive 115 
Connection keep-alive 
Referer http://www.w3schools.com/ajax/tryit_view.asp 
Origin http://www.w3schools.com 

Response Headers 
Date Sat, 01 May 2010 21:54:59 GMT 
Server Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8l DAV/2 mod_jk/1.2.28 
Etag "3d5cbdb-fb4-4819c460d4a40" 
Accept-Ranges bytes 
Content-Length 4020 
Cache-Control max-age=7200, public, proxy-revalidate 
Expires Sat, 01 May 2010 23:54:59 GMT 
Content-Range bytes 0-4019/4020 
Keep-Alive timeout=5, max=100 
Connection Keep-Alive 
Content-Type application/javascript 

Request Headers 
Host localhost 
User-Agent Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language en-us,en;q=0.5 
Accept-Encoding gzip,deflate 
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive 115 
Connection keep-alive 
Origin null 

ОБНОВЛЕНО:
Я нашел проблему, речь шла о кросс-доменных запросов. Я знал, что есть ограничения, но думал, что они расслаблены для локальной файловой системы и локальных серверов. (и ожидаемое более подробное сообщение об ошибке, в любом случае)
Спасибо всем!

+1

Спасибо за заголовки, но сам код JavaScript будет наиболее полезным. – icio

+0

Это может быть даже пример на w3schools, о котором я говорил. Вы отправитесь туда, измените «ajax_info.txt» на свой локальный url, нажмите «Изменить и нажмите меня», а затем «Изменить содержимое». Теперь вы можете увидеть запрос в firebug. –

+0

Если вы решили проблему самостоятельно, предпочтительный способ показать, что в Stack Oveflow необходимо написать свое решение в качестве ответа, а затем пометить свой ответ как принятый. Это также предотвратит появление вашего вопроса на странице «Без ответа». –

ответ

1

Кажется, озеро проблема с кэшированием. Просто удалите кеш внутри Internet Explorer и повторите эксперимент. Все HTTP-запросы GET будут кэшироваться. IE кеш также ajax ответов. Если вам это не нравится, вы можете добавить URL-адрес с текстом типа «? P = blala». Где «p» - это имя, которое будет интерпретироваться как имя параметра, а текст «blala» должен быть уникальным в каждом запросе. Обычно для создания такого «blala» используется конструкция (new Date).getTime(). IE будет «думать», этот URL-адрес является новым и всегда будет отправлять запрос на сервер.

ОБНОВЛЕНО: Кэширование статических данных будет производиться во всех браузерах, особенно если веб-сервер явно разрешить это: см Cache-Control: max-age=7200, public, proxy-revalidate является ответ от сервера. Просто попробуйте пойти в http://www.w3schools.com/ajax/tryit.asp?filename=tryajax_first и изменить строку

xmlhttp.open("GET","ajax_info.txt",true); 

в

xmlhttp.open("GET","ajax_info.txt?p=" + (new Date).getTime(),true); 

затем нажмите на кнопку "Edit и Click Me >>". Затем, если вы нажмете кнопку «Изменить содержимое», вы увидите в полном объеме данные HTTP-трафика. Я не вижу никакого кода 206. Что это означает, что если ответ есть «Accept-Ranges: bytes» и «Content-Range», как «bytes 0-4019/4020» внутри заголовка HTTP вы можете прочитать на http://benramsey.com/archives/206-partial-content-and-range-requests/

+0

Забыл сказать, что я использую Firefox и Chrome для тестирования. В любом случае, очистка кеша действительно помогает преобразовать 206 в 200, спасибо за это! Хотя, это все еще не работает правильно. –

+0

#for update # Он удаляет 206, как я уже сказал, но тело ответа по-прежнему пусто (и запрос в красном в firebug, интересно, может ли он указать более конкретную причину). Но спасибо за попытку. –

+0

У меня не было времени на этот эффект с http://www.w3schools.com/ajax/tryit.asp?filename=tryajax_first. Если ваш сервер доступен из Интернета, вы можете отправить ссылку. Или у вас есть пыльник, как можно воспроизвести эффект, который у вас есть. – Oleg

Смежные вопросы