TL; DR: 302, 307 и страницы ошибок кэшируются. Требуется принудительное обновление содержимого.
Расширенная версия: я установил очень минимальный экземпляр squid, работающий на шлюзе, который не должен кэшировать НИЧЕГО, но должен использоваться исключительно в качестве веб-фильтра на основе домена. Я использую другое приложение, которое перенаправляет неаутентифицированных пользователей на прокси-сервер, который затем использует параметр deny_info, перенаправляет любой запрос, не внесенный в белый список, на страницу входа. После того, как пользователь прошел аутентификацию, правило брандмауэра размещается так, что они больше не отправляются на прокси.
Проблема в том, что когда пользователь попадает на веб-сайт (xkcd.com), он не аутентифицируется, поэтому его перенаправляют через брандмауэр:
iptables -A unknown-user -t nat -p tcp --dport 80 -j REDIRECT --to-port 39135
к прокси-серверу на этом этапе squid перенаправляет пользователя на страницу входа, используя 302 (я также пробовал 307, и я также удостоверился, что для заголовков установлено значение no-cache и / или no-store для Cache-Control и Прагма). Затем, когда пользователь входит в систему, он получает правило брандмауэра, которое больше не направляет его на прокси-сервер squid. Но если они снова перейдут на xkcd.com, у них будет кеширована исходная страница перенаправления, и они снова получат страницу входа.
Есть идеи, как заставить эти перенаправления НЕ кешироваться браузером? Возможно, это проблема браузеров, а не Squid, но я не знаю, как ее обойти.
Полный конфиг сквида ниже.
#
# Recommended minimum configuration:
#
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl localnet src 192.168.182.0/23 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
acl https port 443
acl http port 80
acl CONNECT method CONNECT
#
# Disable Cache
#
cache deny all
via off
negative_ttl 0 seconds
refresh_all_ims on
#error_default_language en
# Allow manager access only from localhost
http_access allow manager localhost
http_access deny manager
# Deny access to anything other then http
http_access deny !http
# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !https
visible_hostname gate.ovatn.net
# Disable memory pooling
memory_pools off
# Never use neigh cache objects for cgi-bin scripts
hierarchy_stoplist cgi-bin ?
#
# URL rewrite Test Settings
#
#acl whitelist dstdomain "/etc/squid/domains-pre.lst"
#url_rewrite_program /usr/lib/squid/redirector
#url_rewrite_access allow !whitelist
#url_rewrite_children 5 startup=0 idle=1 concurrency=0
#http_access allow all
#
# Deny Info Error Test
#
acl whitelist dstdomain "/etc/squid/domains-pre.lst"
deny_info http://login.domain.com/ whitelist
#deny_info ERR_ACCESS_DENIED whitelist
http_access deny !whitelist
http_access allow whitelist
http_port 39135 transparent
## Debug Values
access_log /var/log/squid/access-pre.log
cache_log /var/log/squid/cache-pre.log
# Production Values
#access_log /dev/null
#cache_log /dev/null
# Set PID file
pid_filename /var/run/gatekeeper-pre.pid
Думаю, я мог бы найти решение этой проблемы. После нескольких дней попыток понять это, только случайно наткнувшись на
client_persistent_connections off
server_persistent_connections off
Это сработало. Так что дело было не столько в кэше, сколько в единственном постоянном соединении, которое все испортило. W000T!