天天看點

Apache 容器 Directory Location Files 及htaccess檔案

配置段容器的類型

相關子產品 core mod_proxy

相關指令 <Directory> <DirectoryMatch> <Files> <FilesMatch> <IfDefine> <IfModule> <Location> <LocationMatch> <Proxy> <ProxyMatch> <VirtualHost>

  主要講解 <Directory>   <Files>   <Location>   

1. 檔案系統容器  <Directory>

<Directory>和<Files>是針對檔案系統的指令。<Directory>段中的指令作用于指定的檔案系統目錄及其所有子目錄,.htaccess 檔案可以達到同樣的效果。下例中,/var/web/dir1及其所有子目錄被允許目錄清單。

<Directory /var/web/dir1>

Options +Indexes       允許目錄清單(加号允許、減号禁止)

</Directory> 

<Directory /var/web/dir1>

Options FollowSysLinks       允許符号連結(在目前目錄下檔案 test.html 連結至其它目錄檔案test.html)

</Directory>                             (正常情況無法通路)

2. <Files>

   作用域        server config, virtual host, directory, .htaccess    覆寫項        All

   狀态        核心(C)

   子產品        core

      <Files>段中的指令作用于特定的檔案名,而無論這個檔案實際存在于哪個目錄。

<Files>段将根據它們在配置檔案中出現的順序被處理,在<Directory>段和.htaccess檔案被處理之後,但在<Location>段之前。請注意:<Files>能嵌入到<Directory>段中以限制它們作用的檔案系統範圍

    下例中的配置指令如果出現在配置檔案的主伺服器段,則會拒絕對位于任何目錄下的private.html的通路。

<Files private.html>

Order allow,deny

Deny from all

</Files> 

       下例中的配置指令 會拒絕對任何目錄下 以 .ht 類型結尾的檔案。

<Files ".ht*">     Require all denied </Files>

<Files "cat.html">

# Insert stuff that applies to cat.html here 任何配置會對cat.html 造成影響

</Files>

<Files " ?at.*"> 

 # 這裡的配置會應用于    cat.html, bat.html, hat.php   等檔案

</Files>

        請注意與<Directory>和<Location>配置段不同的是:<Files>配置段可用于.htaccess檔案當中。這将允許使用者在檔案層面上控制對它們自己檔案的通路。 

3. < Files>和<Directory>段的組合可以作用于檔案系統中的特定檔案。

    <Files>可以嵌套在<Directory>中,隻限制此目錄中的特定檔案

下例中的配置會拒絕對

/var/web/dir1/private.html, 

/var/web/dir1/subdir2/private.html, 

/var/web/dir1/subdir3/private.html

等任何/var/web/dir1/目錄下的private.html的通路。

<Directory /var/web/dir1>

<Files private.html>

Order allow,deny

Deny from all

</Files>

</Directory> 

4.  <Location>  網絡空間容器 說明        将封裝的指令作用于比對的URL

文法        <Location URL-path|URL> ... </Location>

作用域        server config, virtual host

狀态        核心(C)

子產品         core

<Location>是針對網絡空間的指令。下例中的配置會拒絕任何對以/private開頭的URL的通路,如 

http://yoursite.example.com/private, 

http://yoursite.example.com/private123, 

http://yoursite.example.com/private/dir/file.html

等所有以/private開頭的URL。

<Location /private>

Order Allow,Deny

Deny from all

</Location> 

<Location>指令無須檔案系統的支援,下例示範了如何映射特定的URL到由mod_status提供的Apache内部處理器,而并不要求檔案系統中确實存在server-status。

<Location /server-status>

SetHandler server-status

</Location> 

5. 通配符和正規表達式

<Directory>,<Files>, 和<Location>指令可以使用類似C标準庫中的fnmatch的外殼通配符。符号"*"比對任何字元串,"?"比對任何單個的字元,"[seq]" 比對seq序列中的任何字元,符号"/"不比對為任何通配符所比對,是以不能顯式使用。

這些指令都有一個正則的配對指令,<DirectoryMatch>, <FilesMatch>和<LocationMatch>,可以使用與perl一緻的正規表達式,以提供更複雜的比對。但是還須注意下文配置的合并中有關使用正規表達式會如何作用于配置指令的内容。

下例使用非正規表達式的通配符來改變所有使用者目錄的配置:

<Directory /home/*/public_html>

Options Indexes

</Directory> 

下例使用正規表達式一次性拒絕對多種圖形檔案的通路:

<FilesMatch .(?i:gif|jpe?g|png)$>

Order allow,deny

Deny from all

</FilesMatch> 

6. 什麼情況下用什麼

    選擇使用檔案系統容器還是使用網絡空間容器其實很簡單。當指令應該作用于檔案系統時,總是用<Directory>或者<Files>;

而當指令作用于不存在于檔案系統的對象時,就用<Location>。 比如一個由資料庫生成的網頁。     不要試圖用<Location>去限制對檔案系統中對象的通路,因為許多不同的網絡空間路徑可能會映射到同一個檔案系統目錄,導緻你的通路限制被突破。比如:

<Location /dir/>

Order allow,deny

Deny from all

</Location> 

   上述配置對http://yoursite.example.com/dir/請求的确起作用。但是設想在一個不區分大小寫的檔案系統中,這個通路限制會被http://yoursite.example.com/DIR/請求輕易突破。而<Directory>指令才會真正作用于對這個位置的任何形式的請求。(但是有一個例外,就是Unix檔案系統中的連接配接,符号連接配接可以使同一個目錄出現在檔案系統中的多個位置。<Directory>指令能不經過重置路徑名而跟随符号連接配接,是以,對于安全要求最高的,應該用Options指令禁止對符号連接配接的跟随。)

    不要認為使用大小寫敏感的檔案系統就無所謂了,因為有很多方法會将不同的網絡空間路徑映射為同一個檔案系統路徑,是以,能使用檔案系統容器時就應該使用。但是,也有一個例外,就是,把通路限制放在<Location/>段中可以很安全地作用于除了某些特定的以外所有的URL。

7.htaccess檔案      如果一台主機分為十個空間賣給多個使用者,各使用者怎樣控制自己目錄和檔案的通路權限呢?

這裡就可以使用每個目錄下的.htaccess檔案來實作。

開啟目錄的.htaccess功能:

<Directory /var/web/>

AllowOverride All/none  (開啟/關閉)

</Directory>

一定注意不能讓網友直接通路.htaccess 檔案,這個要在主配置檔案中做出限制:

例如:

# # The following lines prevent .htaccess and .htpasswd files from being  # viewed by Web clients.  # <Files ".ht*">     Require all denied </Files> 或者

<FilesMatch "^\.ht*">

 Order allow,deny

  Deny from All

<FilesMatch>

這個.htaccess檔案中可以寫正常配置中的各種語句

比如 列出目錄清單、可以通路符号連結、控制通路權限

一、.htaccess簡介

1.什麼是.htaccess

.htaccess是一個純文字檔案,裡面存放着Apache伺服器配置相關的一些指令,它類似于Apache的站點配置檔案,如httpd.conf(Apache2已經支援多站點,是以你的站點配置檔案可能在/etc/apache2/conf.d/目錄下)。

.htaccess與httpd.conf配置檔案不同的是,它隻作用于目前目錄。另外httpd.conf是在Apache服務啟動的時候就加載的,而.htaccess隻有在使用者通路目錄時加載,開銷大、速度慢。

既然如此,為什麼我們還要用.htaccess呢?因為它配置起來簡單,它還支援重定向、URL重寫以及通路驗證,另外它管理起來很友善,可以很好适應網站遷移。總之,各有優缺點,主要就看你是要從全局考慮還是隻配置單個目錄。

2.AllowOverride All

通常情況下,Apache是預設啟用.htaccess的,但是為了以防萬一,請檢查一下自己站點的配置檔案,如httpd.conf,是否有這行:

AllowOverride All
      

這行允許重寫配置檔案。也就是如果能夠從.htaccess加載配置檔案,那麼就以.htaccess為配置檔案對其所在目錄進行配置。

3.500錯誤

如果你租用了雲服務提供商的主機或者空間,那麼他們可能不會給你讀寫httpd.conf檔案的權限,你也不可能檢查AllowOverride指令參數是否為All,這時,你可以建立一個目錄,在裡面寫一個.htaccess檔案,檔案中随意寫入一些伺服器看不懂的東西,然後通路該目錄裡的一個頁面,耐心等待500錯誤的出現。

如果沒有出現,那麼.htaccess沒有被啟用,你需要向你的服務供應商尋求幫助;如果出現了,那麼恭喜你,你可以對目前目錄重寫Apache配置。

/!\注意:.htaccess文法錯誤可能會影響整個站點,如果你不确定這樣做是否安全,請聯系你的雲服務供應商。

4.有用的文檔

  • .htaccess正規表達式
  • HTTP協定重定向編碼

二、.htaccess通路控制(Allow/Deny)

1.通路控制基礎:Order指令

為了限制使用者通路一些關鍵目錄,.htaccess可以提供目錄通路限制。你隻需要在要限制的目錄中,加入如下.htaccess檔案:

# no one gets in here!
deny from all
      

這會限制所有使用者通過浏覽器通路該目錄,這太一刀切了,是以我們還可以增加一些特定的條件,如允許指定IP位址的通路:

Order Allow,Deny
Deny from All
Allow from 192.168.0.0/24
      

Order指令

Order指令是一個難點,也是配置apache的基礎,它決定了Apache處理通路規則的順序。

  • 通過Allow,Deny參數,Apache首先找到并應用Allow指令,然後應用Deny指令,以阻止所有通路。
  • 通過Deny,Allow參數,Apache首先找到并應用Deny指令,然後應用Allow指令,以允許所有通路。

了解Order的用法後,再仔細考慮下上面的例子,你或許能夠發現Deny指令是多餘的,以下用法和之前的描述語義相同:

Order Allow,Deny
Allow from 192.168.0/24
      

2.利用.htaccess過濾域名或網絡主機(Allow/Deny)

下例可以限制所有含有“domain.com”的網絡主機通路網站:

Order Allow,Deny
Allow from all
Deny from .*domain\.com.*
      

{!}Info:有關htaccess的正規表達式用法,請查閱本站《.htaccess正規表達式》一文。

3.利用.htaccess禁止通路指定檔案(Files)

Files指令可以用于過濾指定檔案:

# secure htaccess file
<Files .htaccess>
 order allow,deny
 deny from all
</Files>
      

4.利用.htaccess禁止通路指定檔案類型(FilesMatch)

下面的代碼将限制通路所有.log和.exe檔案:

<FilesMatch ".(log|exe)$">
 Order allow,deny
 Deny from all
</FilesMatch>
      

我們還可以通過Files指令描述檔案類型,但是需要在指令後面加一個波浪線(~),該符号啟用Files指令的正則表達解析功能:

<Files ~ "^.*\.([Ll][Oo][Gg])|([eE][xX][eE])">
 Order allow,deny
 Deny from all
 Satisfy All
</Files>
      

有以下幾點需要讀者注意:

  • Files之後的波浪線用于開啟“正規表達式”分析。請注意,這是個過時的用法,Apache更推薦使用<FilesMatch>指令[3]
  • 正規表達式必須在雙引号之間,有關htaccess的正規表達式用法,請查閱本站《.htaccess正規表達式》一文。
  • 雙引号中的“管道符”(|)用于将兩種檔案類型(.log和.exe)分開,相當于邏輯“或”
  • Order指令必須嵌在Files節(Section)中,否則将會應用到所有檔案
  • Satisfy All表示必須同時滿足主機級别(Allow/Denay)和使用者級别(Require)的限制,All是預設值,該行可以省略。

5.進階通路控制(Rewrite)

我們還可以通過運用Rewrite實作更強大的通路控制,但是Rewrite不是本文讨論的内容。讀者可以參看:利用RewriteCond和RewriteRule進行通路控制一文。

三、利用.htaccess進行密碼保護與驗證

1.配置.htaccess

AuthType Basic
AuthName "restricted area"
AuthUserFile /usr/local/var/www/html/.htpasses
require valid-user
      

這個配置檔案可以保護.htaccess所在的整個目錄,簡單說明下參數:

  • AuthType:驗證類型為基本類型,密碼以明文方式傳輸到伺服器上
  • AuthName:驗證提示,會出現在驗證對話框中
  • AuthUserFile:驗證配置檔案,用于比對使用者名與密碼,該密碼是加密儲存的
  • require valid-user:隻有在AuthUserFile中出現的使用者才可以通過驗證

如果驗證失敗,則會出現401錯誤。

2.生成.htpasses檔案

如何生成.htpasses檔案呢?我們通過

htpasswd

指令生成密碼檔案:

htpasswd -c /usr/local/var/www/html/.htpasses lesca
      

它會提示你輸入密碼,并确認。之後将密碼檔案.htpasses儲存在/usr/local/var/www/html/目錄下。

3.對檔案進行密碼保護

保護與.htaccess在同一目錄下的檔案secure.php:

# password-protect single file
<Files secure.php>
AuthType Basic
AuthName "Prompt"
AuthUserFile /home/path/.htpasswd
Require valid-user
</Files>
      

保護.htaccess所在目錄下的多個檔案:

# password-protect multiple files
<FilesMatch "^(execute|index|secure|insanity|biscuit)*$">
AuthType basic
AuthName "Development"
AuthUserFile /home/path/.htpasswd
Require valid-user
</FilesMatch>
      

4.對指定IP進行密碼保護

僅允許IP位址為99.88.77.66的主機直接通路該目錄,其他IP需要驗證。

AuthType Basic
AuthName "Personal"
AuthUserFile /home/path/.htpasswd
Require valid-user
Allow from 99.88.77.66
Satisfy Any
      

5.安全性

出于安全考慮,将.htpasses檔案存放在WEB目錄樹之外也許是個好方法,但是由于.htpasses是隐藏檔案,而且Apache不會輸出隐藏檔案,是以可以滿足基本的安全要求。這是通過在主配置檔案中加入如下限制實作的:

<Files ~ "^\.ht">
 Order allow,deny
 Deny from all
 Satisfy All
</Files>
      

一般而言,這是預設設定,使用者無需手動添加。我們唯一需要擔心的是密碼在網絡傳輸過程中是明文形式,這很容易被黑客破譯。Coz[1]提供了一個開源項目Pajamas可以在本地利用JS對密碼進行MD5加密,有興趣的讀者可以前去研究一下。

四、目錄浏覽與首頁

如果你打開本站的下載下傳頁面http://download.lesca.me/,就會發現你可以看見這個站點下的所有檔案。像這樣的特性也可以通.htaccess來設定使用者是否有權限浏覽伺服器目錄。

1.啟用目錄浏覽

# enable directory browsing
Options All +Indexes
      

2.禁用目錄浏覽

# disable directory browsing
Options All -Indexes
      

我們還可以通過IndexIgnore指令來禁用目錄浏覽。

# prevent folder listing
IndexIgnore *
      

通過IndexIgnore指令,我們可以禁止對指定類型的檔案浏覽:

# prevent display of select file types
IndexIgnore *.wmv *.mp4 *.avi *.etc
      

3.自定義目錄浏覽

如果你希望Apache在展示你的WEB目錄時看起來與衆不同,那麼你需要啟用FancyIndexing選項:

<IfModule mod_autoindex.c>
 IndexOptions FancyIndexing 
</ifModule>
      

通過這個選項,你可以實作自定義圖示、添加檔案類型描述、按日期排序等。但是這些已經超過了本文的讨論範圍,Lesca可以給你一個做好的例子,你可以在這頁檢視效果。

4.配置目錄首頁檔案

即使啟用了目錄浏覽,Apache未必會展示該目錄的内容,因為該目錄可能存在像index.htm這樣的預設首頁檔案。Apache會有限展示首頁檔案,我們可以通過.htaccess設定:

DirectoryIndex index.html index.php index.htm
      

5.配置錯誤頁面

如果Apache遇到錯誤,就會輸出錯誤頁面。配置自定義的錯誤頁面,也許可以挽留即将離開的使用者。

# custom error documents
ErrorDocument 401 /err/401.php
ErrorDocument 403 /err/403.php
ErrorDocument 404 /err/404.php
ErrorDocument 500 /er