Apache HTTP Server 版本 2.4
本文補充 mod_rewrite
的 參考文件。其中說明如何使用 mod_rewrite
來控制存取各種資源以及其他相關的技術。包含 mod_rewrite 許多常見用法的範例,並詳細說明每個用法的工作原理。
以下技術禁止其他網站將您的圖片包含在其網頁中。此做法常稱為「熱連結」,導致您的頻寬用於提供內容給其他人的網站。
此技術依賴於 HTTP_REFERER
變數的值,而此變數是選填的。因此,有些人可能規避此限制。但是,大部分使用者會遇到要求失敗,如此一來,該圖片最後會從該其他網站移除。
有數種方式可以處理此情況。
在第一個範例中,我們直接拒絕要求,如果它不是來自我們網站的頁面。在這個範例中,我們假設我們的網站是 www.example.com
。
RewriteCond "%{HTTP_REFERER}" "!^$" RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC] RewriteRule "\.(gif|jpg|png)$" "-" [F,NC]
在第二個範例中,我們並未讓要求失敗,而是顯示替代圖片。
RewriteCond "%{HTTP_REFERER}" "!^$" RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC] RewriteRule "\.(gif|jpg|png)$" "/images/go-away.png" [R,NC]
在第三個範例中,我們將要求重新導向到其他網站上的圖片。
RewriteCond "%{HTTP_REFERER}" "!^$" RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC] RewriteRule "\.(gif|jpg|png)$" "http://other.example.com/image.gif" [R,NC]
而在這些方法中,最後兩個傾向於最有效果,能讓熱連到您的圖片的人員,無法看到預期要看到的圖片。
假如您只想要拒絕資源取用,而非將此請求傳送至其他地方,那麼可以不使用 mod_rewrite 來達成。
SetEnvIf Referer "example\.com" localreferer <FilesMatch "\.(jpg|png|gif)$"> Require env localreferer </FilesMatch>
在這個範例中,我們探討如何封鎖來自特定機器人或使用者代理程式持續發出的請求。
機器人排除標準定義了一個檔案 /robots.txt
,其中會指出您希望機器人排除網站中的哪些部份。但有些機器人會忽略檔案中的內容。
請注意,有些方法不使用 mod_rewrite 即可達成此目的。另請注意,任何依賴用戶端 USER_AGENT
字串的方法都很容易被破解,因為這個字串可以輕鬆變更。
我們使用規則組來指定要保護的目錄以及識別惡意或持續性機器人的用戶端 USER_AGENT
。
在此範例中,我們封鎖一個名為 NameOfBadRobot
的機器人,不讓它取用 /secret/files
位置。您也可以指定一組 IP 位置,如果您嘗試封鎖該使用者代理程式只針對特定來源。
RewriteCond "%{HTTP_USER_AGENT}" "^NameOfBadRobot" RewriteCond "%{REMOTE_ADDR}" "=123\.45\.67\.[8-9]" RewriteRule "^/secret/files/" "-" [F]
您不用針對這一點使用 mod_rewrite,您可以使用此處所示的替代方法達成相同效果。
SetEnvIfNoCase User-Agent "^NameOfBadRobot" goaway <Location "/secret/files"> <RequireAll> Require all granted Require not env goaway </RequireAll> </Location>
如上所述,這種方法很容易破解,只要修改 USER_AGENT
請求標頭即可。如果您遭遇到持續攻擊,您應該考慮在較高層級封鎖它,例如防火牆。
我們希望保留一份主機清單,類似於 hosts.deny
,且讓這些主機無法取用我們的伺服器。
RewriteEngine on RewriteMap hosts-deny "txt:/path/to/hosts.deny" RewriteCond "${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}" "!=NOT-FOUND" [OR] RewriteCond "${hosts-deny:%{REMOTE_HOST}|NOT-FOUND}" "!=NOT-FOUND" RewriteRule "^" "-" [F]
##
## hosts.deny
##
## 注意!這是一份映射而非清單,即使我們將其視為清單也是如此。
## mod_rewrite 對它進行解析,以取得金鑰/值配對,因此至少必須
## 對每個項目提出虛擬值「-」。
##
193.102.180.41 -
bsdti1.sdm.de -
192.76.162.40 -
第二個 RewriteCond 假設您已開啟 HostNameLookups,如此一來,可以解決用戶端 IP 位置。若非如此,您應該移除第二個 RewriteCond,並從第一個 RewriteCond 中移除 [OR]
旗標。
根據請求來源的 Referer 轉向請求,每個 Referer 各自決定轉向目標。
下列規則組使用映射檔,將每個 Referer 與轉向目標關聯起來。
RewriteMap deflector "txt:/path/to/deflector.map" RewriteCond "%{HTTP_REFERER}" !="" RewriteCond "${deflector:%{HTTP_REFERER}}" "=-" RewriteRule "^" "%{HTTP_REFERER}" [R,L] RewriteCond "%{HTTP_REFERER}" !="" RewriteCond "${deflector:%{HTTP_REFERER}|NOT-FOUND}" "!=NOT-FOUND" RewriteRule "^" "${deflector:%{HTTP_REFERER}}" [R,L]
映射檔會列出各個 Referer 的轉向目標,或者,如果我們只是希望轉向回他們的來源,則在映射中放入「-」
## ## deflector.map ## http://badguys.example.com/bad/index.html - http://badguys.example.com/bad/index2.html - http://badguys.example.com/bad/index3.html http://somewhere.example.com/