Linux

使用 deny_info 停止 squid 記憶體 302 和 307

  • October 23, 2012

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 的 no-cache 和/或 no-store和編譯指示)。然後,當使用者登錄系統時,他們會獲得不再將他們定向到 squid 代理的防火牆規則。但如果他們再次訪問 xkcd.com,他們將記憶體原始重定向頁面並再次獲得登錄頁面。

知道如何強制這些重定向不被瀏覽器記憶體嗎?也許這是瀏覽器而不是魷魚的問題,但不知道如何解決它。

下面是完整的魷魚配置。

#                                                                               
# 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!

引用自:https://serverfault.com/questions/441176