存取控制可以由幾個不同的模組完成。其中最重要的模組是mod_authz_core
和mod_authz_host
。本文中還將討論使用mod_rewrite
來實現存取控制。
如果您希望根據存取者的主機地址限制存取您網站的某些部分,則可以使用mod_authz_host
輕鬆完成此操作。
Require
提供了各種允許或拒絕存取資源的不同方法。結合RequireAll
,RequireAny
和RequireNone
指令,這些要求可以以任意複雜的方式組合,以強制執行您的存取策略。
這些指令的用法是:
Require host address
Require ip ip.address
在第一種形式中,地址是完全限定的域名(或部分域名); 如果需要,您可以提供多個地址或域名。
在第二種形式中,ip.address
是IP地址,部分IP地址,網路/網路掩碼對或network/nnn CIDR規範。可以使用IPv4或IPv6地址。
您可以插入而不是否定特定要求。注意,由於not不是值的否定,因此它不能單獨用於允許或拒絕請求。因此,要使用否定拒絕存取,塊必須具有一個評估為true
或false
的元素。例如,如果您有人向您的留言板傳送垃圾郵件,並且您希望將其保留,則可以執行以下操作:
<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'
RewriteRule
標誌導致傳送403 Forbidden響應。使用此方法,可以根據任意條件拒絕對資源的存取。
例如,如果您希望在晚上8點到早上7點之間阻止對資源的存取,則可以使用mod_rewrite
執行此操作。
RewriteEngine On
RewriteCond "%{TIME_HOUR}" ">=20" [OR]
RewriteCond "%{TIME_HOUR}" "<07"
RewriteRule "^/fridge" "-" [F]
這將在晚上8點之後或早上7點之前為任何請求返回403 Forbidden響應。此技術可用於您要檢查的任何條件。如果首選此方法,還可以重定向或以其他方式重寫這些請求。
在Apache 2.4中新增的<If>
指令取代了mod_rewrite
傳統上習慣做的許多事情,但應該先求助於mod_rewrite
。