TLDR:302、307 和错误页面正在缓存。需要强制刷新内容。
详细版本:我设置了一个非常小的 squid 实例,它在网关上运行,不应缓存任何内容,而仅需要用作基于域的 Web 过滤器。我正在使用另一个应用程序,它将未经身份验证的用户重定向到代理,然后使用deny_info 选项将任何非白名单请求重定向到登录页面。用户通过身份验证后,防火墙规则将被放置,因此他们不再被发送到代理。
问题是,当用户访问网站(xkcd.com)时,他们未经身份验证,因此会通过防火墙重定向:
iptables -A unknown-user -t nat -p tcp --dport 80 -j REDIRECT --to-port 39135
此时,squid 使用 302 将用户重定向到登录页面(我也尝试过 307,并且还确保标头设置为 Cache-Control 和 Pragma 的 no-cache 和/或 no-store)。然后,当用户登录系统时,他们会获得防火墙规则,该规则不再将他们定向到 squid 代理。但是,如果他们再次访问 xkcd.com,他们将缓存原始重定向页面,并再次获得登录页面。
知道如何强制这些重定向不被浏览器缓存吗?也许这是浏览器的问题而不是 squid 的问题,但我不确定如何解决这个问题。
下面是完整的 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
答案1
我相信我可能已经找到了解决办法。经过几天的努力,我终于偶然发现了
client_persistent_connections off
server_persistent_connections off
这招奏效了。所以这不是缓存的问题,而是一个单一的持久连接把事情搞乱了。太棒了!