Linux
使用 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 的 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!