Apache HTTP Server 版本 2.4
訪問控制可用幾個不同的模組來執行。其中最重要的模組是 mod_authz_core
和 mod_authz_host
。本文也會說明如何使用 mod_rewrite
來執行訪問控制。
如果您想依據訪客的主機位址來限制存取您網站的部分區域,可用 mod_authz_host
最容易做到這一點。
Require
指令提供多種不同的方法來允許或拒絕存取資源。結合 RequireAll
、RequireAny
以及 RequireNone
指令,這些必要條件可以透過各種複雜的方式結合,來執行任何訪問政策。
Allow
、Deny
以及 Order
指令是由 mod_access_compat
所提供,這些指令已過時,而且將會在未來的版本中移除。您應避免使用這些指令,並避免使用建議使用這些指令的過時教學指南。
這些指令的使用方式為:
Require host address Require ip ip.address
在第一種形式中,address 是完全合格的網域名稱(或部分網域名稱);如果需要,您可以提供多個位址或網域名稱。
在第二種形式中,ip.address 是 IP 位址、部分 IP 位址、網路/網路遮罩配對,或網路/nnn CIDR 規格。可以使用 IPv4 或 IPv6 位址。
請參閱 mod_authz_host 文件 以取得關於此語法進階範例。
您可以插入 not
來否定特定需求。請注意,由於 not
是值的否定,因此無法單獨使用來允許或拒絕要求,因為非真不構成假。因此,要使用否定來拒絕拜訪,則區塊必須具備可評估為真或假的元素。例如,如果您有人對您的留言板進行垃圾郵件攻擊,而您想將他們拒於門外,可以執行下列動作
<RequireAll> Require all granted Require not ip 10.252.46.165 </RequireAll>
來自該地址 (10.252.46.165
) 的訪客將無法看到該指令涵蓋的內容。如果您有一個機器名稱而非 IP 地址,也可以使用機器名稱。
Require not host host.example.com
而且,如果您想封鎖來自整個網域的存取,您可以僅指定地址或網域名稱的一部分
Require not ip 192.168.205 Require not host phishers.example.com moreidiots.example Require not host gov
可以使用 RequireAll
、RequireAny
和 RequireNone
指令來加強一系列更複雜的要求。
使用 <If>
,您可以根據任意環境變數或要求標頭值允許或拒絕存取。例如,要根據使用者代理 (瀏覽器類型) 拒絕存取,您可以執行下列動作
<If "%{HTTP_USER_AGENT} == 'BadBot'"> Require all denied </If>
透過 Require
expr
語法,也可以寫成
Require expr %{HTTP_USER_AGENT} != 'BadBot'
使用 User-Agent
進行存取控制是不可靠的技巧,因為 User-Agent
標頭可以隨終端使用者心意設定為任何內容。
請參閱 表達式文件 進一步說明可用的表達式語法和變數。
[F]
RewriteRule
旗標會傳送 403 禁止回應。如果使用此旗標,您可以根據任意條件拒絕對資源的存取。
例如,如果您想封鎖在晚上 8 點到早上 7 點之間存取某項資源,可以使用 mod_rewrite
進行存取。
RewriteEngine On RewriteCond "%{TIME_HOUR}" ">=20" [OR] RewriteCond "%{TIME_HOUR}" "<07" RewriteRule "^/fridge" "-" [F]
這會對晚上 8 點後或早上 7 點之前的任何要求傳回一個 403 禁止回應。這個技巧可以用於任何您想檢查的條件。如果您比較喜歡,也可以重新導向或重新寫入這些要求。
在 2.4 中新增的 <If>
指令取代 mod_rewrite
傳統上用來執行的許多工作,因此在訴諸 mod_rewrite 之前,您應該先查看這項指令。
表達式引擎 能讓你根據隨意的伺服器變數來做許多事情,詳細的部分請參閱該文件。
此外,你應該閱讀 mod_authz_core
文件以了解如何結合多個存取需求並指定它們如何互動的範例。
請參閱 驗證與授權 指南。