Проблема с кешированием Angular IIS Cloudflare - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть приложение angular 6 с маршрутизацией, созданное с помощью angular cli и обслуживаемое на IIS, конфигурация довольно проста, настройка url-rewrite настроена так, что обновление страницы работает и т. Д.

Проблема, с которой я сталкиваюсь, заключается в том, что иногда, когда приложение обновляется, браузеры получают ответ 304 для index.html (даже если он изменился) и загружают старый index.html из памяти / дискового кэша, и затем попытайтесь загрузить пакеты, которые больше не существуют, ответ для этих пакетов равен 200 и содержит новый index.html, который браузер пытается запустить как JS и выдает ошибку.

Отключение кэширования в web.config для устранения неполадок не имеет никакого эффекта, поскольку 304, кажется, имеет приоритет.

Странно то, что при обновлении сайта посещение host.com может вернуть новый index.html, и все в порядке, а посещение host.com/login может вернуть 304 и вызвать проблему. Это зависит от браузера, некоторые делают то же самое, но наоборот.

Запросы проходят через cloudflare, контроль над конфигурацией которого у меня нет (кто-то другой управляет этим для клиента). Может ли проблема с облачным сигналом или это более вероятно в моей конфигурации IIS?

Вот web.config в данный момент:

<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="api rule" stopProcessing="true">
            <match url="api/(.*)" />
            <action type="Rewrite" url="http://localhost:8080/{R:0}" />
        </rule>
        <rule name="Angular Routes" stopProcessing="true">
          <match url=".*" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
            <add input="{QUERY_STRING}" pattern="/api/(.*)" negate="true" />
          </conditions>
          <action type="Rewrite" url="/" />
        </rule>
      </rules>
    </rewrite>
    <staticContent>
        <clientCache cacheControlMode="DisableCache" />
    </staticContent>
  </system.webServer>
</configuration>

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

В итоге я добавил правило в свой web.config, чтобы отключить кэширование только для index.html следующим образом:

<location path="index.html">
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="DisableCache" />
    </staticContent>
  </system.webServer>
</location>

Кажется, что это исправило проблему, пакеты все еще кэшируются, но когда мы развертываем новые сборки, клиенты всегда получают последний index.html, поэтому указывают на правильный пакет. Вероятно, есть лучший способ.

Казалось, проблема возникает только тогда, когда перезапись URL-адреса происходит быстро после посещения сайта, может быть, из-за какого-то состояния гонки ?, т.е. на домашней странице находится / login, так что посещение host.com/login всегда было хорошо и получит последний index.html, но посещение host.com привело к кешированному index.html, после чего угловой маршрутизатор сразу же перенаправил на / login, который затем сделал еще один запрос, и перезапись URL-адреса вернула 304. Все еще не совсем уверен, что происходит, но отключил кэширование index.html решил проблему на данный момент.

0 голосов
/ 10 октября 2018

У меня была точно такая же проблема. Для меня я устанавливал информацию о кеше для статического содержимого в web.config, но он также применялся к index.html. Скорее всего, вы полагаетесь на правила кэширования Cloudflare - посмотрите, могут ли они добавить правило, чтобы index.html не кэшировался (или кэшировался в течение очень короткого времени).

...