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 ------------------------------------------------------------ 6Parent 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.1K12 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出來,相信這對大家的理解非常有幫助。