<-
Apache > HTTP Server > 文件 > 版本 2.4 > Rewrite

使用 mod_rewrite 控制存取

可用語言:  en  |  fr 

本文補充 mod_rewrite參考文件。其中說明如何使用 mod_rewrite 來控制存取各種資源以及其他相關的技術。包含 mod_rewrite 許多常見用法的範例,並詳細說明每個用法的工作原理。

請注意,這些範例在您特定的伺服器設定中大多無法直接使用,因此,您了解它們很重要,而不要只是把範例剪下貼上到您的設定中。
Support Apache!

請參閱

top

禁止圖片「熱連結」

說明

以下技術禁止其他網站將您的圖片包含在其網頁中。此做法常稱為「熱連結」,導致您的頻寬用於提供內容給其他人的網站。

解決方案

此技術依賴於 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>
top

封鎖機器人

說明

在這個範例中,我們探討如何封鎖來自特定機器人或使用者代理程式持續發出的請求。

機器人排除標準定義了一個檔案 /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 請求標頭即可。如果您遭遇到持續攻擊,您應該考慮在較高層級封鎖它,例如防火牆。

top

拒絕拒絕清單中的主機

說明

我們希望保留一份主機清單,類似於 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] 旗標。

top

轉向器基於 Referer

說明

根據請求來源的 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/

可用語言:  en  |  fr 

top

註解

注意
這裡並非 Q&A 區段。置於此處的留言應針對改善文件或伺服器的建議,而我們的審核人員可能會在實施後或認為無效/離題時予以移除。關於如何管理 Apache HTTP Server 的問題應轉發至我們的 IRC 頻道 #httpd(在 Libera.chat 上),或寄送到我們的郵件清單