使用deny_info停止squid缓存302和307

使用deny_info停止squid缓存302和307

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

这招奏效了。所以这不是缓存的问题,而是一个单一的持久连接把事情搞乱了。太棒了!

相关内容