2016-02-26 4 views
6

При получении в браузере следующего HTML-заголовка Cache-control устанавливается браузером для запросов XHTTP, сделанных в основной области, но не для запроса, сделанного из обратного вызова таймаута. Это приводит к тому, что второй ресурс всегда загружается из кеша, если кеш отсутствует. Почему включение запроса в обратный вызов влияет на заголовки кеша, подобные этому?Как сделать XMLHttpRequest от обратного вызова влиять на кеширование?

<!DOCTYPE HTML> 
<html> 
    <body> 
    <script type="text/javascript"> 

     var get = function (url) { 
     var xhttp = new XMLHttpRequest(); 
     xhttp.open("GET", url, true); 
     xhttp.send(); 
     } 

     get("resource1.html"); // Cache-control set 

     setTimeout(function() { 
     get("resource2.html"); // Cache-control not set 
     }, 10); 

     get("resource3.html"); // Cache-control set 

    </script> 
    </body> 
</html> 

(я проверил это на всех машинах и браузерах у меня есть под рукой, и результаты вполне согласуются. Единственным исключением является то, что Firefox, похоже, установить заголовок Cache-Control для ресурса обратного вызова, если таймаут установлен на 0, которого другие браузеры все равно не делают).

ответ

-1

Не удается воспроизвести сейчас, но давайте попробуем дома в ...

я тестировал с:

app.js

router.get(/resource./, function(req, res) { 
    res.setHeader('Cache-Control', 'public, max-age=90'); 
    res.send('<hr/>'); 
}); 
router.get('/', function(req, res) { 
    res.render('index'); 
}); 

index.html

<!DOCTYPE HTML> 
<html> 
<body> 
<script type="text/javascript"> 

    var get = function (url) { 
     var xhttp = new XMLHttpRequest(); 
     xhttp.open("GET", url, true); 
     xhttp.send(); 
    } 

    get("resource1.html"); // Cache-control set 

    setTimeout(function() { 
     get("resource2.html"); // Cache-control not set 
    }, 10); 

    get("resource3.html"); // Cache-control set 

</script> 
</body> 
</html> 

Все они получают 200-х ...

enter image description here

и кэш-контроль

HTTP/1.1 200 OK 
X-Powered-By: Express 
Cache-Control: public, max-age=90 
Content-Type: text/html; charset=utf-8 
Content-Length: 5 
ETag: W/"5-mkFFtL4+3G6hWYdNAMJUPw" 
Date: Thu, 03 Mar 2016 16:09:48 GMT 
Connection: keep-alive 

Кроме того, журнал:

первый раз

Listening on port 3000 
GET/200 12.544 ms - 499 
/resource1.html undefined 
GET /resource1.html 200 1.389 ms - 5 
/resource3.html undefined 
GET /resource3.html 200 0.353 ms - 5 
/resource2.html undefined 
GET /resource2.html 200 0.233 ms - 5 

второй раз

GET/200 1.627 ms - 499 
/resource1.html no-cache 
GET /resource1.html 200 0.427 ms - 5 
/resource3.html no-cache 
GET /resource3.html 200 0.160 ms - 5 
/resource2.html no-cache 
GET /resource2.html 200 0.408 ms - 5 
+1

Я спрашиваю о том, что заголовки 'cache-control' устанавливаются в запросе браузера, а не в ответе сервера. Если вы добавите 'console.log (req.path, req.headers [" cache-control "]);' в обработчик '/ resource. /', Очистите кеш браузера и перезагрузите, вы увидите, что запрос ' resource2.html' не имеет заголовка 'cache-control'. –

+0

Извинения, если вопрос был неоднозначным. Я отредактировал текст, чтобы уточнить. –

+0

@IanMackinnon [обновлено] какой браузер вы используете? Вы пробовали в режиме «инкогнито»? – malix

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

  • Нет связанных вопросов^_^