Чому сервер ігнорує зміни в файлах коду, навіть якщо кеш-код відключений?


14

Я тестую html / js-код на своєму localhost (Windows 7, Chrome v79.0.3945.130 (64-бітний)), і приблизно 50% змін часового коду не відображаються в браузері (я бачу це за допомогою Dev Tools / Sources ).
В Інтернеті є безліч порад, але жоден, схоже, не працює:

  • Клацніть правою кнопкою миші на перезавантаженні та вибрав "Порожній кеш і жорстке перезавантаження" - не допомагає в 30% випадків.
  • Вимкнути кеш на вкладці "Мережа" Інструментів Chrome Dev - не допоможе.
  • Додати <meta http-equiv="Cache-control" content="no-cache">в заголовку - не допомагає.
  • Замінити <script src="common.js"></script>на <script src="common.js?blabla"></script>- допомагає у 60% випадків, але робити це потрібно після кожної зміни - це велика справа. Крім того, він не працює зі змінами html.
  • Скопіюйте файл у новий файл (наприклад, index.html до index2.html) та замініть ім’я файлу в коді - завжди працює, але це ще більша справа.

Точно така ж проблема, коли я вчиняю код на github.io

Будь ласка, допоможіть мені зробити це, щоб сайт відображав зміни коду негайно.


Редагувати: я створив файл index3.html і помістив туди лише "привіт світ". Відкрив файл у браузері. Змінено на "привіт world2" - браузер оновив вміст. Змінено на "hello world3" - браузер все ще показував "hello world2" навіть після багаторазових перезавантажень та "Порожній кеш-пам'ять та жорстке перезавантаження". Я змінив на "hello world4" - браузер все ще показував "hello world2". За 4 години я змінився на "hello world5" - у браузері все ще відображається "hello world2". Цей файл я редагував за допомогою базового блокнота.


Edit2: Люди продовжують запитувати, який сервер я використовую. Це виглядає як частина проблеми. На жаль, я не знаю і не знаю, що саме мені потрібно зробити, щоб перевірити це. Ось усе, що я дізнався поки що:

  • У мене є inetpub/wwwrootкаталог, куди я поміщаю html & js файли, а потім відкриваю index.html у веб-переглядачі http://localhost/.
  • Панель "Моя мережа" в інструментах розробників виглядає приблизно так: посилання на зображення .
  • Настройка сервера пройшла дуже швидко і не потребувала додаткового програмного забезпечення для встановлення. Тобто я не використовую node.js.
  • Існує iisstart.htm, inetpub/wwwrootі коли я відкриваю, http://localhost/iisstart.htmвін каже IIS7.

Я іноді знаходжу відключення кешу в інструментах хромованого розробника + оновлення + ввімкнення кеша знову + оновлення іноді виправляє проблему? Можливо, варто постріляти ...
— Нік Парсонс

2
який тип сервера ви використовуєте?
— Jhecht

@Jhecht як це перевірити?
— klm123

1
З того, що я бачу у відповідях, ви, ймовірно, обходите це параметром. І це, мабуть, спрацює. Однак зазвичай це не повинно бути необхідним при відключенні кешу в інструментах хромованого розробника. Отже, моя думка буде мати ще один кеш-пам'ять. Між вами та сервером може бути будь-яка кількість додаткових технологій кешування. Кілька прикладів: кешування на стороні сервера (наприклад, лак), кешування CDN (наприклад, Cloudflare), локальні проксі з маршрутизатора / брандмауеру (наприклад, кеш-кеш) та подібні речі. Я б також перевірив їх.
— Jey DWork

1
@ klm123, не знаючи, про який веб-сервер йдеться, неможливо сказати вам, як змінити або перевірити конфігурацію кешу для цього. Якщо ви не маєте уявлення про свій веб-сервер, один із можливих способів перевірити його - на вкладці мережі devTools: перевірте заголовки відповідей завантаженого index.htmlна щось на зразок X-Powered-Byабо Serverзаголовка, що може дати підказку веб-серверу. Гугл для шляху вашого файлу inetpub/wwwrootсильно вказує на сервер IIS.
— acran

Відповіді:


6

Використання параметра - це правильний шлях! Тут ви можете додати номер версії, який ви змінюєте лише при великих змінах вручну, а для налагодження ви можете встановити її Date.time (), тому у вашому тезі <head> це змушує перезаписати всі кешовані версії, оскільки параметр завжди новий один:

< script type="text/javascript"> 
    var script = document.createElement('script'); 
    var version = Date.time();
    script.src = "common.js?v="+version; 
    document.head.appendChild(script) 
< /script>

Сподіваюся, це допомагає!


Я думаю, я можу це зробити. Але хіба це фактично не є таким, як у мого четвертого варіанту? додати "? blabla" після імені файлу. Це працює не дуже часто - це або те саме ім’я файлу на вкладці "Джерела", або додано blabla, але вміст файлу все одно той самий.
— klm123

Це не те саме. Після того, як параметр використовується двічі (який ніколи не станеться з Date.time () може винести кешированниє версії блабла те ж саме після того, як використовувати його в два рази не використовувати його взагалі.?.
— lehm.ro

Параметр не використовується два рази. Я редагую код, потім змінюю параметр, потім перевіряю вихідний код у браузері, і це старий.
— klm123

Ви спробували мій підхід?
— lehm.ro

Ваш підхід допомагає, дякую. Але це не вирішує мою проблему. Те, що ви написали, не відповідає дійсності в моїй ситуації. "змушує перезаписати всі кешовані версії, оскільки параметр завжди новий", зміна параметра на нову не змушує кеш надійно перезавантажуватися. Крім того, він не може допомогти зі змінами в index.html.
— klm123

3

На сервері IIS7 під керуванням Windows 7, щоб запобігти кешування вашого вмісту, потрібно внести деякі зміни у ваш один із названих файлів конфігурації web.config. Файли конфігурації для IIS 7 та новіших версій розміщуються %WinDir%\System32\Inetsrv\Config folderтам, де %WinDir%знаходиться папка, де ви встановили Windows (як правило C:/Windows).

Створіть резервну копію web.configфайлу перед редагуванням, щоб ви могли відмовити його, якщо зміни, внесені до файлу, порушують його.

У свій web.configфайл просто додайте наступне, щоб запобігти кешування файлів index.html:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <location path="index.html">
    <system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="Cache-Control" value="no-cache" />
        </customHeaders>
      </httpProtocol>
    </system.webServer>
  </location>

</configuration>

Отримайте шлях до файлу до цього web.configфайлу: Windows Doc: Посилання на конфігурацію

Отримана вище конфігурація кешу: Як відключити кешування однофайлового HTML-файлу програми, що подається через IIS?


У згаданому шляху немає web.config. Я створив його і поклав туди ваш код. Але мені довелося замінити index.html на повний шлях projectName/index.html, який я копіюю з URL-адреси у своєму браузері http:/localhost/projectName/index.html. Результат - не впливає на проблему кешування.
— klm123

@ kim123 Чи можете ви спробувати додати web.configфайл у кореневу папку свого веб-сайту (папку, де знаходиться ваш сайт) та змінити шлях назад на справедливий index.htmlі побачити, чи це працює.
— AndrewL64

я зробив. це не допомагає.
— klm123

1

У мене була така ж проблема, і це мій контрольний список:

  1. Перевірте web.config (кешування та кеш-пам'ять клієнтів, кеш-політику ядра тощо) або .htaccess (кеш-керування набору заголовків).
  2. Якщо ви використовували динамічні мови на зразок ASP, PHP, можливо, є внутрішній параметр кешу. В одному випадку я знайшов <%Response.Expires=1440%>багато рядків коду ASP, і він долав усі інші настройки! У php session_cache_expireможливо те ж саме.
  3. Якщо ви використовуєте IIS, то перевірте заголовки сервера > HTTP-відповіді, щоб переконатися, що кеш також нічого не стосується для окремих веб-сайтів, вказаних під іменем сервера.
  4. перевірити http-equiv="Cache-control"html-заголовки (ви пройшли цей тест!).

Нарешті, я повинен сказати, що в усіх ситуаціях, що перераховані вище, перевірка відключення кешу на вкладці newtwork на консолі Chrome завжди працювала для мене, щоб переглянути свіжу версію сторінок, однак це добре лише для налагодження, і відвідувачі цього не роблять!


1. Де я можу знайти web.config та .htaccess? 2. Я використовую лише html та js. 3. Заголовки відповідей HTTP виглядають приблизно так: imgur.com/leYpdej
— klm123

Якщо ви використовуєте IIS, web.congfig знаходиться в корені від wwwroot. Крім того, на рівні сервера є файл Machine.config, який ви можете змінити його з консолі IIS безпосередньо звідси: stackoverflow.com/questions/2325473/where-is-machine-config . Якщо ви використовуєте сервер apache у Windows, будь ласка, серіть windows, щоб знайти .htaccess @ klm123
— Алі Шейхпур,

0

У конкретному випадку з використанням Google Chrome спробуйте: Відкрийте інструменти Dev -> Перейдіть на вкладку "Мережа". Установіть прапорець "Вимкнути кеш-пам'ять", після цього оновіть сторінку.

ПРИМІТКА. Для того, щоб це працювало кожен раз, коли вікно інструментів Dev ОБОВ'ЯЗКОВО залишатися відкритим у будь-який час.

введіть тут опис зображення

Однак, щоб розповсюджувати зміни на своїх користувачів, не вимагаючи оновлення сторінки тощо, ви повинні додавати версії файлів у кінці кожного згаданих файлів для файлів, які часто змінюються (так, як ви вказали). Наприклад:

<link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/stackoverflow/primary.css?v=20b379f72a37" >

v=20b379f72a37Доданому до кінця це автоматично згенерований файл хеш вмісту файлу.


Ось пункт 2 у моєму списку.
— klm123

Ви впевнені, що вікно Dev Tools залишається відкритим?
— Мартін Шишков

вікно інструментів розробки відкрито, прапорець встановлено [але я зазвичай дивлюся на вкладку джерел], і я навіть ретельно оновлююсь.
— klm123

0

Це довгий знімок - але який редактор / IDE ви використовуєте? Крім того, які зміни ви вносите в index.html?

Чи можете ви надати кілька прикладів таких змін, які не відображаються під час збереження та спроби завантажити файл?

Я хотів би спробувати відтворити вашу проблему. З того, що люди пропонують, не видно, що проблема полягає в самому коді. Я підозрюю, що це питання навколишнього середовища, але мені потрібно більше інформації від вас, щоб підтвердити мої підозри.


Я використовую код візуальної студії microsoft. Приклад: замініть <script src = "common.js"> </script> на <script src = "common.js? Blabla">. Приклад2: додайте нову кнопку, додайте новий div, додайте виклик функції завантаження. Tbh, це виглядає як будь-які зміни.
— klm123

Дивіться зміни в кінці мого запитання.
— klm123

0

Те, що ви пишете в мета-HTML, - це рекомендація браузерам, а не сувора інструкція. Якщо в браузері включено суворе кешування, це не допоможе.

Рішення добре описано: https://curtistimson.co.uk/post/front-end-dev/what-is-cache-busting/

Я вважаю за краще на серверній частині додати до скриптів версію з датою останнього оновлення самого файлу.

<script src="/myScript.js?v=1579780745150"></script>

Там, де 1579780745150 є Unix Timestamp, оновлює сам файл myScript.js . Він працює лише з власними файлами, але зовнішні не потрібні. Найчастіше у назві файлу є версія.


Якщо вам потрібен код бекенда. Скажіть, яку платформу ви використовували.
— Олександр Смітюх

0

Це, мабуть, дуже засмучує, і це не здається, що ви робите щось не так.

Проблема, ймовірно, що між вашим браузером та файлом сценарію, який ви викликаєте, виконується кешування.

Щоб визначити, що це таке, дозвольте запитати, як ви переглядаєте URL-адресу localhost?

Приклади:

file://path/to/file.html
http://localhost/file.html
http://127.0.0.1/file.html
http://[machine's-hostname]/file.html
http://[custom-domain-defined-in-hosts-file]/file.html

Якщо ви працюєте, file://path/to/file.htmlце означає, що ви не переглядаєте веб-сервер / проксі. Якщо це так, http://[something]/file.htmlви запускаєте якийсь веб-сервер, і це, швидше за все, винуватець. Шукайте якесь налаштування, де ви можете вимкнути кешування.

Якщо ви не використовуєте веб-сервер і буквально переглядаєте локальний html-файл без веб-сервера, я б припустив, що винуватцем є браузер. Якщо це так, я б запропонував вимкнути кешування браузера, як запропонував Мартин Шишков .


це http://localhost/ProjectName/index.htmlДе це налаштування, де ви можете вимкнути кешування?
— klm123

Схоже, на екрані, який ви розмістили в іншому місці, ви використовуєте IIS (також його називають Інтернет-інформаційними службами Microsoft). Швидке рішення - просто двічі клацнути файл .html, щоб завантажити його у веб-переглядачі, який використовуватиме a file://path/to/projectName/index.html. Це видалить веб-сервер з рівняння. Щоб продовжувати використовувати IIS та просто виправити кеш, перегляньте цю статтю: support.microsoft.com/en-us/help/247404/…
— Dean Householder

0

Chrome робить це там, де, якщо файл не надто змінився, не впевнений, що це означає, він буде використовувати "компільовану" кеш-версію. Для html це означає розібране Донське дерево. Для попередньо складеного коду JS тощо.

Зазвичай існують способи вирішити це, багато фреймворків використовують хеш всередині імен файлів, як-от:, main.md5hash.jsоскільки зміна імені файлу недійсний будь-який кеш.

Тоді вам не залишиться можливого оновлення html. І щоб було зрозуміло, я не впевнений, ви завжди можете додати коментар випадковою крапкою ... як побачення.


0

Виходячи з оновлень вашої відповіді, я б сказав, що ваша проблема викликана IIS v7, що вона використовує вашу пам'ять ПК для кешування, а не локального жорсткого диска, тому Hard reloadвсі інші методи, здається, не працюють належним чином.

Я міг придумати 3 рішення:

1. Виправлення проблеми з кешем IIS: (Не перевірено через те, що у мене немає ПК з IIS)

  1. У меню " Пуск" натисніть " Адміністративні інструменти" , а потім натисніть Менеджер інформаційних служб Інтернету (IIS). (див. зображення )
  2. У дереві зору на лівій стороні , знайти додаток.
  3. Виберіть пункт меню кешування вихідних даних .
  4. Клацніть на Додати правило кешу, а потім введіть файл extensions, який ви хочете вимкнути кеш на них, тобто .aspx.css, .js тощо ... (один на час, я думаю?)
  5. Тепер ви можете або скасувати кешування в режимі користувача, або перевірити, щоб запобігти кешування. Це має виглядати приблизно так:

введіть тут опис зображення

Джерело рішення - Детальніше про кеш IIS 7


2. Використання деяких альтернатив IIS Є дуже багато, але я рекомендую (виходячи з мого досвіду) WAMP або XAMPP Обидва дадуть вам кращу "середовище" для розробки та обидва підтримують Windows 7. Також, якщо ви знайомі з VS Code ви можете просто використовувати розширення Live Server .


3. Використовуйте режим інкогніто Chrome , розробляючи. (Не впевнений, чи працює він для IIS7)


Додати правило кешу / запобігти кешування - не допомагає [спробував html]. Режим анонімного перегляду - не допомагає.
— klm123

Ви пробували з .jsфайлами? це залежить від того, які зміни ви вносите.
— awran5
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.