Apache虛擬主機VirtualHost的目錄訪問權限

我的Apache默認的虛擬主機目錄爲“D:\Program Files\Zend\Apache2\htdocsApache”,當添加一個新的虛擬主機VirtualHost的根目錄設置成其他分區的時,如“F:\”,發現虛擬主機不能使用。查看Apache的httpd.conf文件,發現“Order allow,deny       Allow from all”選項用於控制訪問權限。添加上面的訪問控制選項,就能正常訪問了該VirtualHost
<VirtualHost 127.0.0.1:80>
ServerAdmin  test.com
DocumentRoot "F:/test"
ServerName test.com
ErrorLog "D:\Program Files\Zend\Apache2\logs\error1.log"
CustomLog "D:\Program Files\Zend\Apache2\logs\access1.log" combined

<Directory />
Options Indexes FollowSymLinks
AllowOverride  None
Order allow,deny
Allow from all

</Directory>
</VirtualHost>
另外還要注意Appache默認的根目錄htdocs目錄的訪問權限
<Directory "D:\Program Files\Zend\Apache2/htdocs">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.2/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks
    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride ALL
    #
    # Controls who can get stuff from this server.
    #
    Order allow,deny
    Allow from all

</Directory>
#
參考文獻:Apache的Order Allow,Deny 詳解:http://www.cnblogs.com/top5/archive/2009/09/22/1571709.html
Allow和Deny可以用於apache的conf文件或者.htaccess文件中(配合Directory, Location, Files等),用來控制目錄和文件的訪問授權。
所以,最常用的是:
Order Deny,Allow
Allow from All

注意“Deny,Allow”中間只有一個逗號,也只能有一個逗號,有空格都會出錯;單詞的大小寫不限。上面設定的含義是先設定“先檢查禁止設定,沒有禁止的全部允許”,而第二句沒有Deny,也就是沒有禁止訪問的設定,直接就是允許所有訪問了。這個主要是用來確保或者覆蓋上級目錄的設置,開放所有內容的訪問權。

按照上面的解釋,下面的設定是無條件禁止訪問:
Order Allow,Deny
Deny from All

如果要禁止部分內容的訪問,其他的全部開放:
Order Deny,Allow
Deny from ip1 ip2
或者
Order Allow,Deny
Allow from all
Deny from ip1 ip2


apache會按照order決定最後使用哪一條規則,比如上面的第二種方式,雖然第二句allow允許了訪問,但由於在order中allow不是最後規則,因此還需要看有沒有deny規則,於是到了第三句,符合ip1和ip2的訪問就被禁止了。注意,order決定的“最後”規則非常重要,下面是兩個錯誤的例子和改正方式:

Order Deny,Allow
Allow from all
Deny from domain.org
錯誤:想禁止來自domain.org的訪問,但是deny不是最後規則,apache在處理到第二句allow的時候就已經匹配成功,根本就不會去看第三句。
解決方法:Order Allow,Deny,後面兩句不動,即可。

Order Allow,Deny
Allow from ip1
Deny from all
錯誤:想只允許來自ip1的訪問,但是,雖然第二句中設定了allow規則,由於order中deny在後,所以會以第三句deny爲準,而第三句的範圍中又明顯包含了ip1(all include ip1),所以所有的訪問都被禁止了。
解決方法一:直接去掉第三句。
解決方法二:
Order Deny,Allow
Deny from all
Allow from ip1

下面是測試過的例子:
--------------------------------
Order deny,allow
allow from all
deny from 219.204.253.8
#全部都可以通行
-------------------------------
Order deny,allow
deny from 219.204.253.8
allow from all
#全部都可以通行
-------------------------------
Order allow,deny
deny from 219.204.253.8
allow from all
#只有219.204.253.8不能通行
-------------------------------
Order allow,deny
allow from all
deny from 219.204.253.8
#只有219.204.253.8不能通行
-------------------------------
-------------------------------
Order allow,deny
deny from all
allow from 219.204.253.8
#全部都不能通行 
-------------------------------
Order allow,deny
allow from 219.204.253.8
deny from all
#全部都不能通行 
-------------------------------
Order deny,allow
allow from 219.204.253.8
deny from all
#只允許219.204.253.8通行 
-------------------------------
Order deny,allow
deny from all
allow from 219.204.253.8
#只允許219.204.253.8通行 
-------------------------------
--------------------------------
Order deny,allow
#全部都可以通行(默認的)
-------------------------------
Order allow,deny
#全部都不能通行(默認的)
-------------------------------
Order allow,deny
deny from all
#全部都不能通行
-------------------------------
Order deny,allow
deny from all
#全部都不能通行
-------------------------------
對於上面兩種情況,如果換成allow from all,則全部都可以通行!
-------------------------------
Order deny,allow
deny from 219.204.253.8
#只有219.204.253.8不能通行
-------------------------------
Order allow,deny
deny from 219.204.253.8
#全部都不能通行
-------------------------------
Order allow,deny
allow from 219.204.253.8
#只允許219.204.253.8通行
-------------------------------
Order deny,allow
allow from 219.204.253.8
#全部都可以通行
-------------------------------
-------------------------------
order deny,allow
allow from 218.20.253.2
deny from 218.20
#代表拒絕218.20開頭的IP,但允許218.20.253.2通過;而其它非218.20開頭的IP也都允許通過。
-------------------------------
order allow,deny
allow from 218.20.253.2
deny from 218.20
#和上面的差不多,只是掉換的order語句中的allow、deny先後順序,但最終結果表示全部都拒絕!


form:http://hi.baidu.com/enjoypain/blog/item/f48c7aecdba298d12f2e21ac.html
前段時間做了個Apache的HTTP代理服務器,其中的order allow,deny這部分弄的不太懂,於是上網找資料看,誰知道越看越糊塗,其中有些難以分辨對錯甚至是誤導。就像破解windows系統密碼的一些文章那樣,很多都是人云亦云的,並沒有經過測試。廢話少說,先把我經過測試後分析總結出來的結論show出來,相信這對大家的理解非常有幫助。

總則——

影響最終判斷結果的只有兩點:
1. order語句中allow、deny的先後順序;
2. allow、deny語句中各自包含的範圍。

溫馨提醒——
1. 修改完配置後要保存好並重啓Apache服務,配置才能生效;


2. 開頭字母不分大小寫;

3. allow、deny語句不分先後順序,誰先誰後不影響最終判斷結果;但都會被判斷到;

4. order語句中,“allow,deny”之間“有且只有”一個逗號(英文格式的),而且先後順序很重要;

5. Apache有一條缺省規則,“order allow,deny”本身就默認了拒絕所有的意思,因爲deny在allow的後面;同理,“order deny,allow”本身默認的是允許所有;當然,最終判斷結果還要綜合下面的allow、deny語句中各自所包含的範圍;(也就是說order語句後面可以沒有allow、deny語句)


6. allow、deny語句中,第二個單詞一定是“from”,否則Apache會因錯而無法啓動,

7. “order allow,deny”代表先判斷allow語句再判斷deny語句,反之亦然。
上面說的都是要記住的,而下面說的是我獨創的理解方法。如果有人看了而沒有豁然開朗的感覺,那算是我的失敗!
判斷原則分4步走——
1. 首先判斷默認的;
2. 然後判斷逗號前的;
3. 最後判斷逗號後的;
4. 最終按順序疊加而得出判斷結果。

上面三點我說的簡單而形象,主要是爲了便於記憶。暫時不理解不要緊,繼續看下面詳細的解說自然會明白。下面以一個普通例子來做解釋——
order deny,allow
allow from 218.20.253.2
deny from 218.20

1. 所謂“首先判斷默認的”,就是判斷“order deny,allow”這句,它默認是允許所有;

2. 所謂“然後判斷逗號前的”,因爲在本例子中的order語句裏面,deny在逗號的前面,所以現在輪到判斷下面的deny語句了——“deny from 218.20”;

3. 所謂“最後判斷逗號後的”,因爲在本例子中的order語句裏面,allow在逗號的後面,所以最後輪到判斷下面的allow語句了——“allow from 218.20.253.2”。

4. 所謂“最終按順序疊加而得出判斷結果”,這是一個形象化了的說法,我把每一步判斷都看作一個“不透明的圖層”,然後一步步按順序疊加上去,最終得出的“圖像”就是判斷結果。
用過作圖軟件的人應該都知道“圖層”是怎麼回事,我估計Apache關於order allow deny這方面的設計理念和photoshop等作圖軟件關於圖層的設計理念是一樣的。即“遊戲規則”是一樣的。
那麼上面的例子就可以是這麼一個步驟和圖像——
1. 先畫一個白色的大圓,代表“order deny,allow”語句,默認意思是允許所有;


2. 然後畫一個小一點的黑色圓,代表“deny from 218.20”語句,意思是拒絕所有以218.20開頭的IP,放進白色的大圓裏面;

3. 最後再畫一個白色的圓,代表“allow from 218.20.253.2”語句,意思是允許218.20.253.2通過,放在黑色圓的上面。

4. 到此爲止,我們已經可以看到一個結果了,白色大圓上面有一個黑色圓,黑色圓上面還有一個白色圓。最後,我們所能看到的黑色部分就是拒絕通行的,剩下的白色部分都是允許通行的。判斷的結果就是這麼簡單形象!

如果不懂的用作圖軟件,我們再來個非常貼近生活的比喻——
把上面的例子改動一點點,以便更好的理解:
order deny,allow
allow from 218.20.253.2
deny from 219.30

1. 首先拿一張A4白紙,代表第order語句,意思是允許全部;

2. 然後拿一張黑色紙剪一個圓,放在A4紙裏面的某個位置上,代表deny語句,意思是拒絕所有以219.30開頭的IP;

3. 最後拿白紙再剪一個圓,放在黑色圓的旁邊,代表allow語句,意思是允許218.20.253.2通過;注意,這個例子不是放進黑色圓裏面了,因爲deny和allow語句不再有相互包含的關係了。
4. A4紙上面有一個黑色圓和一個白色圓,結果自然很明顯了。不過白色的A4紙上再放一個白色的圓,顯然是多餘的了,因爲大家都是白色的,都代表允許,所以就重複了,可以去掉白色的圓而不會影響判斷結果。
如果看到這裏還沒明白,那一定是我還有什麼沒說清楚的。那麼請好好分析我所做過的測試例子,將在最後列出來。

在這裏再囉嗦一下,allow、deny語句後面跟的參數有多種形式,有不同的表達方式,我在網上看到的做法是deny from IP1 IP2 IP3或allow from domain.com等。其它的表達方式大家再找別的資料看吧。我想說的是另一種表達方式:
order deny,allow
allow from IP1 IP2
allow from domain.info
allow from 219.20.55.0/24
deny from all

我沒具體驗證過這是否對,不過這樣是可以正常啓動Apache服務的,按道理應該是正確的表達方式。哈哈,像我這樣的入門者只能這樣了,還希望大家多多指教!

下面是測試過的例子:
--------------------------------
Order deny,allow
allow from all
deny from 219.204.253.8
#全部都可以通行
-------------------------------
Order deny,allow
deny from 219.204.253.8
allow from all
#全部都可以通行
-------------------------------
Order allow,deny
deny from 219.204.253.8
allow from all
#只有219.204.253.8不能通行
-------------------------------
Order allow,deny
allow from all
deny from 219.204.253.8
#只有219.204.253.8不能通行
-------------------------------
-------------------------------
Order allow,deny
deny from all
allow from 219.204.253.8
#全部都不能通行 
-------------------------------
Order allow,deny
allow from 219.204.253.8
deny from all
#全部都不能通行 
-------------------------------
Order deny,allow
allow from 219.204.253.8
deny from all
#只允許219.204.253.8通行 
-------------------------------
Order deny,allow
deny from all
allow from 219.204.253.8
#只允許219.204.253.8通行 
-------------------------------
--------------------------------
Order deny,allow
#全部都可以通行(默認的)
-------------------------------
Order allow,deny
#全部都不能通行(默認的)
-------------------------------
Order allow,deny
deny from all
#全部都不能通行
-------------------------------
Order deny,allow
deny from all
#全部都不能通行
-------------------------------
對於上面兩種情況,如果換成allow from all,則全部都可以通行!
-------------------------------
Order deny,allow
deny from 219.204.253.8
#只有219.204.253.8不能通行
-------------------------------
Order allow,deny
deny from 219.204.253.8
#全部都不能通行
-------------------------------
Order allow,deny
allow from 219.204.253.8
#只允許219.204.253.8通行
-------------------------------
Order deny,allow
allow from 219.204.253.8
#全部都可以通行
-------------------------------
-------------------------------
order deny,allow
allow from 218.20.253.2
deny from 218.20
#代表拒絕218.20開頭的IP,但允許218.20.253.2通過;而其它非218.20開頭的IP也都允許通過。
-------------------------------
order allow,deny
allow from 218.20.253.2
deny from 218.20
#和上面的差不多,只是掉換的order語句中的allow、deny先後順序,但最終結果表示全部都拒絕!

























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章