Отключить кеш для динамически созданного Javascript

Я создал динамический файл javascript (test.js) в PHP с Symfony2, и я не хочу, чтобы этот файл кэшировался браузером. Когда я вставляю скрипт test.js 2 раза на одну страницу, в первый раз он загружается непосредственно с сервера, а во второй раз скрипт загружается из кеша браузера. Эта проблема возникает в Chrome и IE, в Firefox все работает нормально.

Вот живой пример: http://goo.gl/sggKks (если вы видите 3 раза одно и то же число, это означает, что это загружается из кеша, если 3 разных номера загружаются с сервера)

Я пробовал много разных настроек PHP Header(), это ничего не меняет.

PS: я не могу использовать случайное число, например test.js?r=923902390, чтобы сделать трюк, мне нужно другое решение


person Siol    schedule 11.07.2015    source источник
comment
Это заставляет меня задуматься о методах оптимизации на уровне браузера. Поскольку это один и тот же ресурс, будет ли хром или IE даже делать 3 запроса? Сетевая консоль IE11 показывает только один запрос на файл js, если верить этому. Понятия не имею о Хроме.   -  person spenibus    schedule 11.07.2015
comment
Попробуйте установить директиву no-cache для URL-адреса, с которого вы предоставляете свой файл javascript, например: http://symphonyextensions.com/extensions/page_http_caching/   -  person David Sulc    schedule 11.07.2015
comment
Дэвид, я использую не symphony, а symfony2. это мне не помогает   -  person Siol    schedule 12.07.2015
comment
Не могли бы вы объяснить, почему вы не можете изменить URL-адрес? Это помогло бы исключить идеи.   -  person spenibus    schedule 12.07.2015
comment
Поскольку это для рекламной сети, а тег javascript уже используется на нескольких сайтах, код не может измениться.   -  person Siol    schedule 13.07.2015


Ответы (2)


Идея 1 (основная)

Создайте случайность содержимого в javascript на стороне клиента. Заставьте javascript работать немного больше. Это, наверное, то, что следует сделать. Это более разумно. Если только это невозможно.

Идея 2 (менее разумная и, вероятно, чрезмерно продуманная)

Заставьте скрипт проверять свой собственный URL-адрес и загружать другую (рандомизированную) копию самого себя.

// self contained auto cloning facility
(function(){

   // see http://www.2ality.com/2014/05/current-script.html
   var currentScript = document.currentScript || (function() {
      var scripts = document.getElementsByTagName('script');
      return scripts[scripts.length - 1];
   })();

   // get script tag url (self)
   var url = currentScript.getAttribute('src');

   // url doesn't have random part
   if(!url.match(/\?\d+$/)) {

      // create new script tag with random part
      var s = document.createElement('script');
      s.src = url+'?'+Math.round(Math.random()*1000000000);
      document.body.appendChild(s);

      // engage wild brakes
      throw "stop";
   }
})();

// do the actual job below this point
person spenibus    schedule 13.07.2015

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

<filesMatch "\.js$">
  FileETag None
  <ifModule mod_headers.c>
     Header unset ETag
     Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
     Header set Pragma "no-cache"
     Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
  </ifModule>
</filesMatch>

Вам необходимо активировать модуль Apache Header.

Если вы не можете использовать это, вы должны определить свой JS-файл как маршрут в Symfony и установить эти заголовки в ответе вашего контроллера.

person Raphaël Malié    schedule 12.07.2015