在一段Apache配置中往往會(huì)出現(xiàn)一對令人疑惑的值,DocumentRoot和Directory,原因在于它們后面跟了一樣的路徑。
一.虛擬主機(jī)
以一段vhost(虛擬主機(jī))的配置為例。該配置由軟件自動(dòng)生成,由于它可以正常運(yùn)行,我們從這里入手。
<VirtualHost *:80> DocumentRoot "E:\www\public" --① ServerName www.test.com ServerAlias <Directory "E:\www\public"> --② Options FollowSymLinks ExecCGI AllowOverride All Order allow,deny Allow from all Require all granted </Directory> </VirtualHost>
?、貲ocumentRoot代表根目錄
②代表該目錄的基本屬性
可以看到的一個(gè)現(xiàn)象是:①②目錄一致,且該路徑下一般都有index.php入口文件。
二.服務(wù)器配置
httpd.conf一般用于配置Apache的主體依賴環(huán)境。在其中有一段配置定義:
# # Deny access to the entirety of your server's filesystem. You must # explicitly permit access to web content directories in other # <Directory> blocks below. # DocumentRoot "D:\phpStudy\WWW" <Directory /> Options +Indexes +FollowSymLinks +ExecCGI AllowOverride All Order allow,deny Allow from all Require all granted </Directory>
注意到包含關(guān)系,即主體配置中會(huì)包含虛擬主機(jī)標(biāo)簽,可以推測出虛擬主機(jī)的設(shè)置是在全局主體配置的基礎(chǔ)上進(jìn)行增量定義的。
httpd.apache.org/docs/2.4/mod/core.html#directory
在Apache的官方文檔中給出了Directory標(biāo)簽的說明:定義該目錄、及子目錄的配置屬性。
有意思的是各個(gè)屬性配置項(xiàng)的含義,如下:
Options:復(fù)寫選項(xiàng)策略,可選值有Indexes、FollowSymLinks和ExecCGI等。
分別代表"允許列舉目錄"、"允許Directory路徑定義以外的鏈接文件"、"允許執(zhí)行CGI程序"。
AllowOverride:復(fù)寫重定向策略
Order:復(fù)寫可用指令集
Allow:復(fù)寫可訪問網(wǎng)站的地址集
三.對比結(jié)論
實(shí)際上明白各種語法的含義后,至此答案已經(jīng)明了。
DocumentRoot屬性用于指定了一種URL映射的根目錄路徑。例如http://localhost/
而Directory標(biāo)簽是為了指定URL路徑在后續(xù)的請求中可以進(jìn)行操作的權(quán)限范圍屬性。
注意到二的一段黑字,我們將有可能把一的①②路徑寫得不一致,即DocumentRoot為子目錄,Directory為父目錄。
<VirtualHost *:80> DocumentRoot "E:\www\public" ServerName test.com ServerAlias <Directory "E:\www"> Options -Indexes -FollowSymLinks +ExecCGI AllowOverride All Order allow,deny Allow from all Require all granted </Directory> </VirtualHost>
在此配置文件中指定了不允許列舉目錄、禁止PHP程序訪問Directory路徑定義以外的鏈接文件、允許執(zhí)行CGI程序、對根目錄授予了允許所有訪問都接受的權(quán)限。
由于根目錄(DocumentRoot)的路徑是目錄訪問定義(Directory)的一個(gè)子目錄,理應(yīng)也能正常運(yùn)行。
在E:\www\public下新建一個(gè)index.php文件,echo "Hello World"。
啟動(dòng)httpd.exe后一切正常