Apache存取控制


存取控制可以由幾個不同的模組完成。其中最重要的模組是mod_authz_coremod_authz_host。本文中還將討論使用mod_rewrite來實現存取控制。

1. 主機存取控制

如果您希望根據存取者的主機地址限制存取您網站的某些部分,則可以使用mod_authz_host輕鬆完成此操作。

Require提供了各種允許或拒絕存取資源的不同方法。結合RequireAllRequireAnyRequireNone指令,這些要求可以以任意複雜的方式組合,以強制執行您的存取策略。

這些指令的用法是:

Require host address
Require ip ip.address

在第一種形式中,地址是完全限定的域名(或部分域名); 如果需要,您可以提供多個地址或域名。

在第二種形式中,ip.address是IP地址,部分IP地址,網路/網路掩碼對或network/nnn CIDR規範。可以使用IPv4或IPv6地址。

您可以插入而不是否定特定要求。注意,由於not不是值的否定,因此它不能單獨用於允許或拒絕請求。因此,要使用否定拒絕存取,塊必須具有一個評估為truefalse的元素。例如,如果您有人向您的留言板傳送垃圾郵件,並且您希望將其保留,則可以執行以下操作:

<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

可以使用RequireAllRequireAnyRequireNone指令來強制執行更複雜的需求集。

2. 任意變數的存取控制

使用<If>,您可以根據任意環境變數或請求檔頭值來允許或拒絕存取。例如,要拒絕基於使用者代理(瀏覽器型別)的存取,您可以執行以下操作:

<If "%{HTTP_USER_AGENT} == 'BadBot'">
    Require all denied
</If>

使用Require expr語法,這也可以寫成:

Require expr %{HTTP_USER_AGENT} != 'BadBot'

3. 使用mod_rewrite進行存取控制

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