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


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.