Apache 使用 Order、Allow、Deny 三指令構建「三階段過濾機制」,預設順序為 Order Deny,Allow。處理流程如下:
Order 宣告的第一個關鍵字對應的所有規則。若匹配 Allow 則許可、匹配 Deny 則拒絕;若無任何匹配,預設動作為「拒絕」(若第一關鍵字為 Allow)或「許可」(若為 Deny)。Order 宣告的第二個關鍵字對應的所有規則。若匹配則執行對應動作(許可/拒絕),覆蓋第一階段結果。Order 中第二個關鍵字的預設動作(Allow→許可,Deny→拒絕)。<Directory "/server">
Order Allow,Deny
Allow from 127.0.0.1
</Directory>
邏輯推演:
Allow from 127.0.0.1 → 本機許可;其他 IP 無匹配 → 預設拒絕。Deny 規則 → 無動作。Order 第二關鍵字 Deny → 拒絕。結果:僅 127.0.0.1 可存取,其餘全部擋下。
<Directory "/server">
SetEnvIf User-Agent "Firefox" ff=1
Order Allow,Deny
Allow from env=ff
</Directory>
SetEnvIf 檢查請求標頭 User-Agent 含「Firefox」字串,設定環境變數 ff=1。Allow from env=ff 僅許可帶有該環境變數的請求。Deny from env=惡意爬蟲特徵 阻擋特定爬蟲。RewriteEngine On
RewriteCond %{TIME_HOUR} >20 [OR]
RewriteCond %{TIME_HOUR} <07
RewriteRule ^/fridge - [F]
解析:
%{TIME_HOUR} 為伺服器時間(24 小時制,0-23)。[F] 旗標回傳 403 Forbidden,直接拒絕存取 /fridge 路徑下資源。擴充應用:結合 %{REMOTE_ADDR}、%{QUERY_STRING}、%{HTTP_REFERER} 等變數,可實現防盜鏈、封鎖惡意掃描器、動態維護模式等複雜邏輯。
Order Allow,Deny 或 Order Deny,Allow,避免依賴預設值造成誤解。Require ip 192.168.1.0/24、Require expr %{TIME_HOUR} >= 8 && %{TIME_HOUR} <= 20 等語法,語意更清晰、效能更佳,建議遷移。LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 記錄被拒絕請求(狀態碼 403),便於事後分析攻擊模式。mod_authz_dbd 或外部快取服務(Redis + Lua),避免巨大 .htaccess 拖慢請求處理。靈活運用 Apache 存取控制模組,能在 Web 層面構建第一道彈性、可審計的安全防線。