1. 程式人生 > >apache的<directory>語句以及屬性的含義

apache的<directory>語句以及屬性的含義

在整完apache和tomcat的之後我覺得有必要把<directory>和它下面的屬性捋順一下

如何訪問根目錄下的目錄http://192.168.1.12/test/

第一.預設apache不允許訪問http目錄(沒有定義,就沒有訪 
問許可權)

1 訪問目錄http://192.168.1.12/test/
2 會顯示:
3 Forbidden
4 You don't have permission to access /test/ on this server.

第二.無限制目錄訪問 
在httpd.conf中增加定義,即可開啟無限制的目錄訪問許可權

1
<Directory /home/macg/www/test> 2 Options All 3 AllowOverride all 4 </Directory>

再訪問會顯示如下:

 1 Apache/2.0.54 (Fedora) Server at 192.168.1.12 Port 80
 2 
 3 Index of /test
 4  Name                    Last modified      Size  Description
 5  ------------------------------------------------------------
 6
Parent Directory - 7 bg0073.jpg 29-Nov-2006 21:02 36K 8 bg0135.jpg 29-Nov-2006 21:03 41K 9 bg0137.jpg 29-Nov-2006 21:03 47K 10 slade1.html 29-Nov-2006 22:02 1.2K 11 slade2.html 29-Nov-2006 22:02 1.1K
12 slade3.html 29-Nov-2006 22:02 1.4K 13 slade4.html 29-Nov-2006 22:02 1.8K 14 slade5.html 29-Nov-2006 22:02 2.3K 15 ------------------------------------------------------------- 16 Apache/2.0.54 (Fedora) Server at 192.168.1.12 Port 80 17 ---------------------

實際AllowOverride all是enable .htaccess目錄限制功能。

但test目錄下並沒有.htaccess檔案

等於開放訪問,無限制。

第三.有限制目錄訪問

將其他目錄中的.htaccess拷貝入要限制訪問的目錄

 1 [[email protected] test]# ls -a
 2 .  ..  bg0073.jpg  bg0135.jpg  bg0137.jpg  slade1.html  
 3 slade2.html  slade3.html  slade4.html  slade5.html
 4 
 5 [[email protected] test]# cp ../test1/.htaccess .
 6 
 7 [[email protected] test]# ls -a
 8 .  ..  bg0073.jpg  bg0135.jpg  bg0137.jpg  .htaccess  
 9 slade1.html  slade2.html  slade3.html  slade4.html  
10 slade5.html
11 
12 [[email protected] test]# more .htaccess
13 authType Basic
14 AuthName "Restricted Files"
15 AuthUserFile /etc/httpd/passwords
16 Require valid-user

再訪問http://192.168.1.12/test/ 
會跳出身份認證視窗,輸入使用者名稱密碼,即可訪問目錄

.htaccess 目錄限制的配置 
要使用.htaccess檔案,先在將httpd.conf中建立

<Directory > 
</Directory>

 1 <Directory "/home/macg/www/test">   
 2         Options All            
 3 允許對目錄的操作,ALL---所有操作
 4 
 5     AllowOverride all                      
 6 AllowOverride all----允許.htaccess所有指令,預設是all
 7 AllowOverride None ----完全忽略.htaccess檔案
 8 
 9 </Directory>

用/usr/bin/htpasswd建立一個用於認證的密碼檔案。 
並且這個檔案不應該置於DocumentRoot目錄下,以避免被下載。 
建議建立在/etc/httpd/目錄下:

 1 [[email protected] httpd]# /usr/bin/htpasswd -c 
 2 /etc/httpd/passwords macg
 3           -c建立檔案
 4 New password:
 5 Re-type new password:
 6 Adding password for user macg
 7 [[email protected] httpd]# /usr/bin/htpasswd 
 8 /etc/httpd/passwords gary  
 9                             沒有-c就是單純的adduser 追加使用者
10 New password:
11 Re-type new password:
12 Adding password for user gary
13 [[email protected] httpd]# more /etc/httpd/passwords
14 macg:U8jCwSsZyAB2g
15 gary:06yCDyg7AijlM

在受限制目錄下建立.htaccess檔案

 1 [[email protected] test]# ls -a
 2 .  ..  bg0073.jpg  bg0135.jpg  bg0137.jpg  .htaccess  
 3 slade1.html  slade2.html  slade3.html  slade4.html  
 4 slade5.html
 5 
 6 [[email protected] test]# more .htaccess
 7 authType Basic
 8 authType--------認證型別
 9      由mod_auth_basic提供的Basic
10 Basic認證方法並不加密來自使用者瀏覽器的密碼(明文傳輸) 更安全的認證方法"AuthType Digest",即由mod_auth_digest供的摘要認證
11 最新的瀏覽器版本才支援MD5認證
12 (認證,伺服器響應速度會受一些影響,一般有幾百個使用者就會對響應速度有非常明顯的影響)
13 
14 
15 
16 AuthName "Restricted Files"
17 AuthName "會員區"
18 此句是顯示給使用者看的
19 
20 AuthUserFile /etc/httpd/passwords
21 此目錄接受passwords內定義使用者的認證請求
22 or
23 Require macg
24 此目錄只接受單一使用者macg(unix使用者)認證請求

<Directory ></Directory>中指令的含義

 1 <Directory "/home/macg/www/test">   
 2         Options All            
 3         AllowOverride all                      
 4 </Directory>
 5   Options指令-------目錄的訪問特性
 6 option  none    禁止對目錄的所有操作
 7 option all      允許對目錄的所有操作,ALL---所有操作
 8 option ExecCGI    對該目錄,可以執行cgi指令碼
 9 option Indexes    允許訪問該目錄(而該目錄沒有index.html)時,返回目錄下的檔案列表                        
10 option FollowSymLinks       只允許對目錄的FollowSymLinks操作
11    AllowOverride指令
12 None    不讀取.htaccess
13 all    all----允許.htaccess所有指令,預設是all
14 Limit    .htaccess函蓋具體限定的主機(allow,deny)
15 AuthConfig    .htaccess函蓋跟認證有關指令(AuthType,AuthName) 

<Directory ></Directory> 對下面的所有子目錄也生效

所以httpd.conf中先對根目錄/進行配置,等於是設定預設配置

 1 httpd.conf中先對根目錄/進行配置,等於是設定預設配置
 2 
 3 <Directory />                                  
 4     Options FollowSymLinks  禁止對目錄的訪問(option只允許對目錄的FollowSymLinks操作)
 5     AllowOverride None      不讀取.htaccess
 6     Order deny,allow        deny all
 7     Deny from all               
 8 
 9 </Directory>
10 
11 
12 <Directory "/usr/local/apache2/htdocs">
13 
14     Options Indexes FollowSymLinks   只允許訪問index和連線   
15     AllowOverride None
16     Order allow,deny       承接父目錄(/)的deny all,這裡也是deny all
17     Allow from all           
18 
19 </Directory>

order allow deny ————-httpd.conf中封IP之類的操作

 1 Apache模組 mod_authz_host   
 2 <Directory /docroot>
 3 Order Deny,Allow
 4 Deny from ...
 5 Allow from ...
 6 
 7 </Directory> 
 8   注意順序:
 9 除了後面allow的,其他都deny
10 典型的封IP
11 Order Allow,Deny
12 Allow from all
13 Deny from 205.252.46.165            
14 注意順序:
15 除了後面deny的,其他都allow
16 
17 Deny from 192.168.2       典型的封網段

上面清楚了 可以設定一個例子

Apache對於多虛擬主機以及多虛擬路徑的配置

 1 ServerName localhost
 2 <Directory />
 3     AllowOverride none
 4     Require all denied 
 5 </Directory>
 6 DocumentRoot "/home/work/"
 7 
 8 ## 保證所有的專案都放在/home/work/目錄, 該目錄只做配置
 9 <Directory "/home/work/">
10     Options None
11     AllowOverride None
12     Require all denied 
13 </Directory>

httpd-vhosts.conf 首先第一件事就是指定預設的DocumentRoot

 1 # 沒有商量, 必須放在httpd.conf中申明的根路徑
 2 # 不需要severName配置
 3 
 4 <VirtualHost 127.0.0.1:8800>
 5     DocumentRoot "/home/work/www/htdocs"
 6     <Directory /home/work/www/htdocs>
 7         AllowOverride none
 8         Require all granted
 9     </Directory>
10 </VirtualHost>
11 
12 ##如果不需要多主機支援,到此為止

新增虛擬主機,虛擬目錄等等

 1 ## 說明: local.baidu.com 為第一個主機名, 如果多個域名對映設定ServerAlias即可
 2 ## Alias 注意“/”的位置
 3 
 4 <VirtualHost local.baidu.com:8800>
 5     DocumentRoot "/home/work/workspace"
 6     ServerName local.baidu.com
 7     # ServerAlias local.baidu.com.cn local.baidu.cn
 8 
 9     <Directory /home/work/workspace>
10         Options FollowSymLinks
11         AllowOverride none
12         Require all granted 
13     </Directory>
14 
15     Alias /phpMyAdmin "/home/work/www/htdocs/phpMyAdmin/"
16 
17     # 新增一個日誌分析, rotatelogs需要自己安裝
18     LogFormat "{method:\"%m\",state:\"%s\",protocol:\"%H\",url:\"%U\",time:\"%{%Y-%m-%d %T}t\",ua:\"%{User-Agent}i\",query:\"%q\",refer:\"%{Referer}i\",server:\"%V\"}" seo 
19     CustomLog "|/usr/sbin/rotatelogs logs/seo_%Y%m%d.log 86400 480" seo
20 </VirtualHost>
21 
22 ## 同上其他主機配置

當然對於該目錄下個各種配置屬性 不過下面這個是2.2的屬性 在2.4中進行了少許的變更 所以2.4還是要查詢文件 不過有下面的解釋打底應該很容易

Allow和Deny可以用於apache的conf檔案或者.htaccess檔案中(配合
Directory, Location, Files等),用來控制目錄和檔案的訪問授權。
所以,最常用的是:
Order Deny,Allow
Allow from All

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

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

1 Order Allow,Deny
2 Deny from All

如果要禁止部分內容的訪問,其他的全部開放:

1 Order Deny,Allow
2 Deny from ip1 ip2
3 或者
4 Order Allow,Deny
5 Allow from all
6 Deny from ip1 ip2

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

1 Order Deny,Allow
2 Allow from all
3 Deny from domain.org

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

1 Order Allow,Deny
2 Allow from ip1
3 Deny from all

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

1 Order Deny,Allow
2 Deny from all
3 Allow from ip1

下面是測試過的例子:

  1 --------------------------------
  2 Order deny,allow
  3 allow from all
  4 deny from 219.204.253.8
  5 全部都可以通行
  6 
  7 -------------------------------
  8 Order deny,allow
  9 deny from 219.204.253.8
 10 allow from all
 11 全部都可以通行
 12 
 13 -------------------------------
 14 Order allow,deny
 15 deny from 219.204.253.8
 16 allow from all
 17 只有219.204.253.8不能通行
 18 
 19 -------------------------------
 20 Order allow,deny
 21 allow from all
 22 deny from 219.204.253.8
 23 只有219.204.253.8不能通行
 24 
 25 -------------------------------
 26 
 27 -------------------------------
 28 Order allow,deny
 29 deny from all
 30 allow from 219.204.253.8
 31 全部都不能通行 
 32 
 33 -------------------------------
 34 Order allow,deny
 35 allow from 219.204.253.8
 36 deny from all
 37 全部都不能通行 
 38 
 39 -------------------------------
 40 Order deny,allow
 41 allow from 219.204.253.8
 42 deny from all
 43 只允許219.204.253.8通行 
 44 
 45 -------------------------------
 46 Order deny,allow
 47 deny from all
 48 allow from 219.204.253.8
 49 只允許219.204.253.8通行 
 50 
 51 -------------------------------
 52 
 53 --------------------------------
 54 Order deny,allow
 55 全部都可以通行(預設的)
 56 
 57 -------------------------------
 58 Order allow,deny
 59 全部都不能通行(預設的)
 60 
 61 -------------------------------
 62 Order allow,deny
 63 deny from all
 64 全部都不能通行
 65 
 66 -------------------------------
 67 Order deny,allow
 68 deny from all
 69 全部都不能通行
 70 
 71 -------------------------------
 72 
 73 對於上面兩種情況,如果換成allow from all,則全部都可以通行!
 74 
 75 -------------------------------
 76 Order deny,allow
 77 deny from 219.204.253.8
 78 只有219.204.253.8不能通行
 79 
 80 -------------------------------
 81 Order allow,deny
 82 deny from 219.204.253.8
 83 全部都不能通行
 84 
 85 -------------------------------
 86 Order allow,deny
 87 allow from 219.204.253.8
 88 只允許219.204.253.8通行
 89 
 90 -------------------------------
 91 Order deny,allow
 92 allow from 219.204.253.8
 93 全部都可以通行
 94 
 95 -------------------------------
 96 
 97 -------------------------------
 98 order deny,allow
 99 allow from 218.20.253.2
100 deny from 218.20
101 代表拒絕218.20開頭的IP,但允許218.20.253.2通過;而其它非218.20開頭的IP也都允許通過。
102 
103 -------------------------------
104 order allow,deny
105 allow from 218.20.253.2
106 deny from 218.20

和上面的差不多,只是掉換的order語句中的allow、deny先後順序,但最
終結果表示全部都拒絕!

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