Проблема с кэшем IIS 8.5 при перезаписи, если файл не существует - PullRequest
0 голосов
/ 29 марта 2020

Мне нужно добиться в IIS следующее:

  1. проверить наличие измененных .txt файлов в dir с URL http://server/dir/test.txt без кеша
  2. переписать URL-адрес на empty.txt если файл не существует

Моя конфигурация:

<rewrite>
  <rules>
    <rule name="test-txt" patternSyntax="Wildcard" stopProcessing="true">
      <match url="*.txt" ignoreCase="false" />
      <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
      </conditions>
      <action type="Rewrite" url="empty.txt" />
    </rule>
  </rules>
</rewrite>
<caching>
  <profiles>
    <add extension=".txt" policy="DisableCache" kernelCachePolicy="DisableCache" />
  </profiles>
</caching>

Если файл изменяется, я получаю код 200 и фактическое содержимое. Работает как положено.

Если файл не изменился - 304. Работает как положено.

Если файл удален, после первой проверки я получаю ошибку 404.0. Почему?

После второго запроса я получаю код 200 и содержание empty.txt. Работает как положено.

Если я создаю файл в этот момент, он работает как положено. Но если делать запросы в короткие промежутки времени (каждые 3-4 секунды), больше не имеет значения, существует файл test.txt или нет, я получаю код 304 или содержимое empty.txt, если я его изменю. Но если я перестану запрашивать файл на несколько минут, он снова будет работать, как и ожидалось.

Похоже, в IIS есть какой-то кэш для проверки состояния файла * stati c. Как заставить его работать как положено только с файлами stati c? (и без получения ошибки 404, если возможно)

1 Ответ

0 голосов
/ 30 марта 2020

Это не кеширование вывода, это просто кеш браузера.

Так что, если вы хотите запретить кеширование для конкретной папки c, пожалуйста, поместите ее в root web.config вашего сайта / применение. В этом случае вам необходимо отключить путь к каталогу example.txt и каталогу dir

  <location path="dir">
        <system.webServer>
            <staticContent>
                <clientCache cacheControlMode="DisableCache" />
            </staticContent>
        </system.webServer>
    </location>
<location path="empty.txt">
    <system.webServer>
        <staticContent>
            <clientCache cacheControlMode="DisableCache" />
        </staticContent>
    </system.webServer>
</location>

Если вы хотите отключить кэш браузера для всего сайта, просто установите

  <clientCache cacheControlMode="DisableCache" /> 

без атрибута местоположения.

Ваше правило отлично работает на моей стороне, поэтому вам просто нужно отключить клиентский кеш для требуемой папки / файла.

enter image description here

enter image description here

...