Squid 2.7 и заголовок клиента max-age=0

Я пытаюсь использовать squid в качестве прокси-сервера обратного кеша перед приложением php на том же компьютере и никогда не позволяю пользователю добраться до бэкэнда, всегда загружаю устаревший кеш в фоновом режиме.


Я использую самокомпилированный squid 2.7-Stable9 с Centos 6.3 (x86_64) на порту 80, а apache+php находится на той же машине с портом 8000.

Заголовок ответа apache+php отправляет это в squid:

header('Cache-Control: max-age=10, stale-while-revalidate=15, stale-if-error=20');
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

Когда я запрашиваю страницу для squid, в первый раз выполняется повторная проверка, а в следующий раз всегда используется устаревшая версия, но это работает с параметром кэширования ОТКЛЮЧИТЬ КЭШ в расширении Firefox WebDevelopersTools.

Разница в том, что когда кеш не отключен, клиент отправляет Cache-control: max-age=0 и If-Modified-Since, а squid всегда подключается к серверной части и перепроверяет .

В Squid 3.2 это работало, как и ожидалось, с помощью ignore-cc, но в 2.7 такой опции нет.

Вот мой squid.conf:

# http_port public_ip:port accel defaultsite= default hostname, if not provided
http_port 80 accel defaultsite=mydomain.com

# IP and port of your main application server (or multiple)
cache_peer 127.0.0.1 parent 8000 0 no-query originserver name=main
cache_peer_domain main mydomain.com

# Do not tell the world that which squid version we're running
httpd_suppress_version_string on

# Remove the Caching Control header for upstream servers
header_access Cache-Control deny all

# log all incoming traffic in Apache format
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
access_log /usr/local/squid/var/logs/squid.log combined all

cache_effective_user squid

refresh_pattern nocache=true 0 0% 0

icp_port 0

Я хочу выбрать время кеша в приложении php и никогда не позволять пользователю видеть задержку повторной проверки, поэтому я использую версию 2.7 с stale-while-revalidate.


Пример запроса с включенным кешем:

GET /some-page HTTP/1.1
Host: mydomain.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1 FirePHP/0.7.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
x-insight: activate
If-Modified-Since: Thu, 11 Oct 2012 10:14:52 GMT
Cache-Control: max-age=0

HTTP/1.0 200 OK
Date: Thu, 11 Oct 2012 10:29:31 GMT
Server: Apache/2.2.22 (PowerStack)
Last-Modified: Thu, 11 Oct 2012 10:29:32 GMT
Content-Type: text/html; charset=UTF-8
X-Cache: MISS from localhost
X-Cache-Lookup: HIT from localhost:80
Via: 1.1 localhost:80 (squid)
Connection: close

Пример с отключенным кешем (что я хочу):

GET /some-page HTTP/1.1
Host: mydomain.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1 FirePHP/0.7.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
x-insight: activate

HTTP/1.0 200 OK
Date: Thu, 11 Oct 2012 10:36:53 GMT
Server: Apache/2.2.22 (PowerStack)
Last-Modified: Thu, 11 Oct 2012 10:36:53 GMT
Content-Type: text/html; charset=UTF-8
Age: 2
Content-Length: 16725
X-Cache: HIT from localhost
X-Cache-Lookup: HIT from localhost:80
Via: 1.1 localhost:80 (squid)
Connection: keep-alive

person Wiliam    schedule 11.10.2012    source источник


Ответы (1)


Решение описано здесь: Как использовать в squid 2.7 функцию 3.1 ignore-cc


Что ж, перепробовав все альтернативы, я изменил исходный код, чтобы реализовать эту функцию.

Я изменил в Squid-2.7-stable9 файл src/refresh.c:282:

282:    if (request) {

для

282:    if (request && FALSE) {

Что-то подобное они делают в версии 3.X для реализации ignoreCc:

269:    if (request && !request->flags.ignore_cc) {

Работал, как ожидалось.

person Wiliam    schedule 15.10.2012