Назад | Перейти на главную страницу

Заставить Apache 2.4 кэшировать файлы со строкой запроса с помощью mod_cache без истечения срока действия

Мне нужно получить mod_cache_disk для кеширования сайта, содержащего строки запроса. Проблема в том, что это продукт поставщика на IIS, который мы пытаемся кэшировать через mod_proxy, и он не содержит заголовков с истекшим сроком действия. Я понимаю, что эта проблема нарушает несколько RFC, и поэтому apache не делает этого по умолчанию.

Есть ли способ заставить apache 2.4.x кешировать строку запроса и заголовок без истечения срока действия?

Эта конфигурация будет кешироваться, но конечно без учета? он кэширует неправильный контент для большинства элементов.

CacheEnable disk https://
CacheEnable disk /
CacheRoot /var/cache/mod_proxy/
CacheDirLevels 4
CacheDirLength 5
CacheIgnoreCacheControl On
CacheIgnoreNoLastMod On
CacheIgnoreHeaders None
CacheMaxFileSize 100000000
CacheMinFileSize 1
CacheMaxExpire 1209600
CacheDefaultExpire 3600
CacheIgnoreQueryString On
CacheStoreNoStore On
CacheStorePrivate On

Если я изменю CacheIgnoreQueryString на Off, он начнет выдавать ошибки, касающиеся заголовка expires.

AH00768: кэш: /view.image?Id=1114 не кэшируется. Причина: присутствует строка запроса, но нет явного срока действия,

В соответствии с этот ответ единственный способ сделать это - позволить Apache видеть нужные заголовки (Expires, о которых вы заявили, и, очевидно, также Last-Modified).

Плакат с этим ответом предлагал написать фильтр на стороне приложения, но, поскольку ваш продукт является продуктом поставщика, это может быть невозможно. Есть ли возможность добавить его прямо в IIS? В противном случае вам может повезти с настройкой двойного прокси: используйте один прокси для добавления заголовков (но не кеша) и прокси который из Apache (берём заголовки и кешируем).

Наиболее очевидным решением было бы удалить строку запроса до того, как она достигнет mod_cache.

И наиболее очевидным модулем для этого будет mod_rewrite.

Но это не будет работать, так как mod_cache начал целенаправленно использовать неизмененная версия строки запроса в 2006 г..

это мое решение

<IfModule mod_cache.c>
    CacheIgnoreNoLastMod On
    CacheIgnoreHeaders Set-Cookie
    <IfModule mod_disk_cache.c>
        CacheRoot D:\\apache_cache
        CacheEnable disk /
        CacheDirLevels 1
        CacheDirLength 1
    </IfModule>
</IfModule>

и со стороны бэкэнда добавьте заголовок

Cache-Control:s-maxage=1200

s-maxage - для прокси-кешей и CDN