系統: CentOS6.5 2.6.32-431.el6.x86_64
軟體: httpd2.4.10
伺服器IP: 192.168.1.241 , 172.16.0.1
用戶端IP: 192.168.1.103 , 172.16.0.10
-
控制頁面屬性的容器:
<Directory "PATH"> </Directory> #作用在檔案系統的目錄路徑
<Location "PATH"> </Location> #作用在URL的路徑
<Files "File”> </Files> #作用在檔案系統單個檔案的路徑
這幾種裡面的配置選項都差不多,隻是作用的範圍不一樣,是以下邊就先用Directory做練習了,
到最後再分别舉個例子,看看差別。
指令的後面還可以加上~來啟用正規表達式,來比對後面的目錄。
如: <Directory ~ "/home/.*/public_html">
<Directory ~ "/home/.*/public_html"> #/home/下的所有使用者網站都啟用這個裡面的參數
Options indexes #裡面的參數選項下面再細說
Require all granted
</Directory>
但是現在有種指令是專門用來比對正則的。就是在後面加上match. 如:
<Directorymatch "/home/.*/public_html">
Options indexes
Require all granted
</Directorymatch>
這種方式大家說速度比上面那個加~的速度更快,而且配置檔案裡面都用的這個,是以就用這個吧。
上面的這個測試注意通配符和正規表達式的差別, ( .*如果寫成了*可是錯誤的)。 這裡隻是為了
測試,是以就用了正則,不然在這樣的小比對中,通配符才是更好的。
上面的幾種容器都是一樣的, 不僅如此,很多的指令都是在後面加上match來比對正則的。
可以的話,盡量用Directory 不要用Location ,速度問題。
2. 容器的參數選項。 注意: 要寫在 Options 後面 , 寫在一行中
Options
Indexes 缺少指定的預設頁面時,将會為使用者列出目錄裡的所有檔案。
FollowSymLinks 允許打開連結檔案所指向的檔案。
None所有都不啟用。
All 所有都啟用。
ExecCGI允許使用mod_cgi子產品執行目錄中的CGI腳本。
Includes 允許使用mod_include子產品實作伺服器端包含(SSI)
MultiViews 允許使用mod_negotiation實作内容協商。
SymLinksIfOwnerMatch 在連結檔案屬主屬組與所指向的檔案的屬主
屬組相同的情況下,允許打開連結檔案所指向的檔案。
例:
1. Indexes
<Directory "/var/apache/ssc.com/">
Options indexes
Require all granted
</Directory>
因為沒有預設要打開的文檔,如index.html,是以以清單顯示出所有的檔案。
下面我們把這一項給去掉再看看。
<Directory"/var/apache/ssc.com/">
Options
Require all granted
</Directory>
被拒絕了吧。
2. FollowSymLinks
先來看看我的檔案清單:
-rw-r--r-- 1 root root 33 Nov 8 14:08 abc.html
lrwxrwxrwx 1 star star 10 Nov 14 11:25 issue -> /etc/issue
lrwxrwxrwx 1 root root 17 Nov 11 21:57 messages -> /var/log/messages
三個檔案,兩個是符号連結檔案,上面的實驗結果沒有顯示連結檔案。加上這一項試試。
<Directory "/var/apache/ssc.com/">
Options Indexes FollowSymLinks
Require all granted
</Directory>
可以通路連結檔案所指向的檔案了。
Apache的使用者也就是daemon使用者要有目标檔案的通路權。
3. SymLinksIfOwnerMatch
跟上面那個顯示連結檔案的多了一點安全性吧。下面把FollowSymLinks 換成這個試試。
<Directory "/var/apache/ssc.com/">
Options Indexes SymLinksIfOwnerMatch
Require all granted
</Directory>
issue沒有顯示出來。 原因就是issue的屬主屬組與符号連結檔案的屬主屬組不同。
-rw-r--r-- 1 root root 33 Nov 8 14:08 abc.html
lrwxrwxrwx 1 star star 10 Nov 14 11:25 issue -> /etc/issue
lrwxrwxrwx 1 root root 17 Nov 11 21:57 messages -> /var/log/messages
-rw-r--r--. 1 root root 47 Nov 27 2013 /etc/issue
issue原檔案是root的屬主屬組, 而連結檔案是star.
4. All None 的意思容易看到, 至于後面的三個, 伺服器報含與内容協商還不會, 而CGI ,以這種方式寫我還沒有成功過,而且舉例也很麻煩, 在這裡就不寫了。
Require http://httpd.apache.org/docs/2.4/howto/auth.html
用來做IP或主機通路控制的。有戶認證也可以用,這裡就不寫了。
有這幾種方式
Require all granted 允許所有IP通路
Require all denied 拒絕所有IP通路
Require ip IPADDR 允許某些IP通路
Require not ip IPADDR 拒絕某些IP通路
IPADDR的書寫方式也有幾種: 而且可以不加區分的寫在同一行,空格分開。
單個IP位址 192.168.1.200 ..
網絡加掩碼 192.168.1.0/255.255.255.0
網絡加掩碼長度 192.168.1.0/24
網絡 192.168.1
在這裡有點特殊的地方: 如果是好幾條通路規則,要寫在下面的幾個容器裡。
<RequireAll> </RequireAll>
<RequireAny> </RequireAny>
<RequireNone> </RequireNone>
在這裡我覺得有必要說一點: 我的英語水準比0高一點,但是還是比不上三腳貓,是以Apache的網站在我這裡隻是擺擺造型而已,上面這三個隻是在網站上找到,但完全不知道怎麼用,是以是一點點試試出來的, 這也就會造成我總結的規則可能會缺胳膊少腿的,是以我想說明的就是您如果真的看進去并且看到了這裡,您就動手試一下,萬一我的結論是錯誤的呢。 希望我的英語水準能夠早日起來。
<RequireAll> 這個還比較好了解點,我覺得。
裡面的規則是拒絕優先。
<Directory "/var/apache/ssc.com/">
Options Indexes SymLinksIfOwnerMatch
<RequireAll>
Require all granted
Require not ip 192.168.1.103
</RequireAll>
</Directory>
我的别一台Linux用戶端是172.16.0.10,我自己用的這台是192.168.1.103.
這是我這台顯示的。
Linux用戶端,就用curl指令來測試一下了。
OK, 是可以通路的。 下面把172.16的網段加上。
<Directory "/var/apache/ssc.com/">
Options Indexes SymLinksIfOwnerMatch
<RequireAll>
Require all granted
Require not ip 192.168.1.103 172.16
</RequireAll>
</Directory>
再來個:下面這個指定IP允許也還是被拒絕,上下順序沒有關系,
<Directory "/var/apache/ssc.com/">
Options Indexes SymLinksIfOwnerMatch
<RequireAll>
Require all denied
Require ip 192.168.1.103
</RequireAll>
</Directory>
OK,簡單的做完了幾個測試, 注意幾點:
在這個<RequireAll>裡面是拒絕優先的,
就像httpd2.2裡面的 Order Allow,Deny, 隻要允許和拒絕的位址有交叉,交叉的位址就以拒絕為準。
<RequireAny>, 這個挺有意思人, 裡面除了Require All denied外不能寫任何拒絕IP的。
嗯,其實就是不能寫 Require not ip .
<RequireAny>
Require all denied
Require ip 192.168.1.103
</RequireAny>
這樣就沒事,httpd服務也可以重新開機。 但是下邊就不行。
Require all denied
Require not ip 192.168.1.103
</RequireAny>
然後還有一點就是, 在裡面是允許優先, 如上面那個就是可以通路的。
<RequireNone> 尴尬了,這個不知道怎麼用。
總是報錯出不來。
主機名控制跟IP控制差不多。 就是寫法是主機名而已。
Require host HOSTNAME
Require not host HOSTNAME
HOSTNAME:
FQDN完整的主機名。
隻有域名。 ssc.com
<Location " "> 是對于URL來做一些通路屬性的。
跟Directory不同的是 不能顯示清單,因為是URL不是固定的檔案。 至于别的就不太清楚了。
<Location "/abc">
Options Indexes SymLinksIfOwnerMatch
Require all granted
</Location>
看看有哪些檔案。
[root@Test sst.com]# ll
total 4
-rw-r--r-- 1 root root 35 Nov 8 14:08 index.html
lrwxrwxrwx 1 root root 10 Nov 14 19:54 issue -> /etc/issue #連結檔案
看來Indexes是沒有生效。
直接指定網頁檔案,就打開了。 再看看SymLinksIfOwnerMatch起作用沒。
這個也打開了。 而且通路控制也是可以用的, 就不貼圖了。
Location 主要用于沒有固定檔案系統路徑,或者根本就沒有檔案系統路徑的。
如Apache自帶的網頁監控伺服器狀态的。