1、htaccess是什麼
htaccess是hypertext access的縮寫。.htaccess檔案是一個被多個Web伺服器(包括Apache)所支援的目錄級配置檔案。
是以,要使用本文中所叙述的功能,首先你得有一個伺服器(Apache)!
2、在Apache中支援.htaccess檔案配置
在Apache中要支援.htaccess檔案,要在站點目錄配置中設定參數AllowOverride 為all(如果隻需要對.htaccess中的部分功能可以設定為其他參數,點選這裡打開AllowOverride參考)。
<Directory ...>
...
AllowOverride all
...
</Directory>
另外.htaccess檔案的名字也可以自定義,例如如果我們要定義為.acl來替代.htaccess這個名字,但是建議使用“ht”開頭,因為Apache預設對".ht"開頭的檔案采取了保護,不允許外部讀取。
配置如下:
AccessFileName .acl
點選這裡打開AccessFileName參考
3、建立.htaccess檔案
建立.htaccess檔案很簡單,直接用文本編輯器建立即可,如果你是在windows環境下建立的話,建議使用第三方的文本編輯器,例如note plus plus會節省很多不必要的麻煩。(編碼相容問題)
4、自定義Http狀态碼對應的頁面(404錯誤頁面)
當使用者發起一個非法的URL請求時候,能夠友好的傳回一個錯誤提示頁面是非常重要的。
例如當使用者輸入一個http://caigesb/xiaozhi.html的時候,伺服器并沒有xiaozhi.html這個檔案,或者無法解 析這個路徑的時候,就會傳回一個錯誤代碼,404。預設情況下浏覽器接受到錯誤代碼404後會有一片空白,或者友好一點的浏覽器會顯示一個預設的錯誤頁面提示這個路徑找不到,甚至國内一些浏覽器會乘機嵌入廣 告。現在,我們要避免這種情況,當這個路徑找不到的時候,跳到一個自定義友好的界面來提示使用者。
這時,我們需要在.htaccess檔案中加入一下配置指令:
ErrorDocument 404 /error_pages/404.html
儲存檔案即可。點選這裡檢視優秀404例子
當然,你也可以為其他的錯誤代碼設定不同的提示頁面,例如401提示未授權,403提示禁止通路,具體點選這裡查閱Http狀态碼及其含義。
5、重定向
利用重定向功能可以把使用者對某個URL的請求重定向到另外一個URL,注意,浏覽器的URL會改變!
例如:由于我的站點域名臨時改變了,但是我不想通知所有的使用者去反問新的域名,即我要把URL: http://caigesb 重定向到 http://xiaozhi 需要在.htaccess檔案中加入一下配置:
6、密碼保護
啟用密碼保護功能可以給指定的目錄設定通路權限。
在.htaccess中加入以下代碼
AuthType Basic
AuthName "Password Required"
AuthUserFile /Users/Caige/***/passwords/passwords.file
Require user caige
解釋:
AuthType Basic 設定加密類型
AuthName 描述資訊,給使用者檢視的提示
AuthUserFile 設定密碼檔案路徑,注意這裡是實體路徑
Require user 設定哪些使用者可以登入
對于生成passwords.file檔案,要使用apache提供的指令htpasswd。期間會要求輸入兩次密碼。
筆者在Mac上的指令如下:
Michaels-MacBook-Pro:~ Caige$ htpasswd -c /Users/Caige/***/passwords/passwords.file caigeNew password: Re-type new password: Adding password for user caige
添加成功後,将會在指定目錄生成密碼檔案passwords.file
用文本編輯器打開passwords.file檔案會發現以下内容。裡面包含了使用者名和密碼資訊,這裡的密碼資訊是經 過加密算法加密的。對于不同的平台會預設算法會不同。也可以在産生密碼的時候通過參數來設定。
caige:$apr1$dneOMY5I$1g1H9IAPFH4B5GA9DrRRU0
以上例子是單使用者的驗證,多使用者的驗證以及自定義加密方式請點選這裡檢視更多。
7、位址過濾
對于某些路徑,例如背景管理等路徑,常常會設定為指定ip才能通路,這樣對站點的安全起到一定的作用。
設定代碼如下:
order allow,deny
allow from 192.168.
allow from *.caige.cn
deny fromfont all
解釋:
order allow,deny 設定allow指令和deny指令的優先級。如果按照目前的優先級,當伺服器接受到一個請 求的時候,伺服器會先去查找allow指令,如果找到,那麼就結束。否則找不到對應的allow指令,采取查找deny指令。
allow from 允許規則
deny from 禁止規則
綜上所屬,上面的配置允許目前目錄隻允許采用以ip為 192.168.*.* 或者域名為 *.caige.cn 的URL來請求才會 得到響應,否則會傳回403禁止通路的提示。
點選這裡檢視詳細設定
8、Rewrite(防盜鍊與禁止通路)
現在很多站點常常采用盜鍊的方式引用别的站點資源以便擷取利益。這樣對于被盜取一方不僅在伺服器資源占 用上産生來影響,同時對其利益方面産生損壞。
下面以防止圖檔盜鍊為例講解.htaccess的如果防止别的站點引用。
假如有站點A上盜用來B站點的圖檔資源
在A站點的頁面上有如下代碼:
<img src="http://www.B.com/img.jpg" />
當B站點不采取任何措施的情況下,A站點利用B站點的伺服器資源來為自己的站點謀取利益。A站點發現後當 然很不爽。于是在.htaccess檔案中加入以下代碼
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !B.com [NC]
RewriteCond %{HTTP_REFERER} !baidu.com [NC]
RewriteRule .*\.(gif|jpg|png)$ http://webeta.cn/no.png [R,NC,L]
解釋:
我們主要是用了Apache的Rewrite功能,是以mod_rewrite子產品的加載進來,具體在httpd.conf檔案中配置。
加載子產品的方法很多,可以直接修改httpd.conf檔案。如果是采用其他的內建Apache的工具例如WAMP,可以直接在圖形界面中加載。
Rewrite 文法:
A、RewriteCond 指令的格式如下 RewriteCond 測試字元串 條件[辨別]。
B、對于測試字元串允許引用變量:
%{
系統變量名字
}
表示擷取系統變量,系統變量允許是Http請求頭資訊,有HTTP_REFERER、 HTTP_USER_AGENT等變量允許使用。
對于條件部分是一個正規表達式的擴充,除了标準的正則文法外還有擴充文法,例如:
‘=’ (等于) 将條件部分當作一個普通字元串,将它和測試字元串進行比較,當測試字元串 與條件部分 完全相同時為真。
‘-d’ (是否為目錄) 将測試字元串當作一個目錄名,檢查它是否存在以及是否是一個目錄。
C、辨別部分。多個标志之間用逗号分隔。預設情況下多個條件是AND的關系,如果需要修改為OR關系則在辨別部分修改為 "[OR]"。另外常用的一個辨別"[NC]"是英文nocase的縮寫表示 不區分大小寫。
RewriteEngine on
表示開啟Rewrite功能
RewriteCond %{HTTP_REFERER} !^$ [NC]
允許空“HTTP_REFERER”的通路,在HTPP頭資訊中Refferer一項允許為空。這樣做允許使用者在浏覽器位址 欄中直接輸入圖檔位址時以圖檔檔案的顯示。一般建議這樣設定,否則使用者在通過代理伺服器通路的時候,由 于HTTP頭資訊不完整會導緻通路問題。
RewriteCond %{HTTP_REFERER} !B.com [NC]
設定為允許B站點自己可以通路。
RewriteCond %{HTTP_REFERER} !baidu.com [NC]
允許搜尋引擎收錄引用。
RewriteRule %{HTTP_REFERER} http://www.B.com/unauthorized.jpg [R,NC,L]
傳回未授權的引用圖檔。後面參數R表示重定向,L表示last的意思,表示這次重定向到此結束。後續的規則不 再進行解析。
當然,B站點也可以直接傳回一個403伺服器不允許通路的錯誤,這樣,盜用站點的圖檔就會變成一個紅色的 交叉,或者空白。
傳回403使用以下指令:
RewriteRule .*\.(gif|jpg|png)$ - [F]
同理,可以防止其他資源被盜用,例如css檔案,js檔案,多媒體檔案等。
不僅對檔案可以禁止,檔案目錄也可以。
當我們php項目中有一個庫目錄 “/includes”。使用者如果可以直接打開這個目錄中的檔案的話會得到一堆錯誤結果,我們不希望開放這個目錄中的php檔案給使用者。
## 開啟Rewrite引擎
RewriteEngine On
RewriteBase /
## 設定條件,這個正則的比對包含 /include/ 的路徑
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /includes/ .*$ [NC]
## 測試是否是php字尾的檔案
RewriteCond %{REQUEST_FILENAME} ^.+\.php$
## 設定禁止反問并結束本次Rewrite判斷。
RewriteRule .* - [F,NS,L]
點選檢視關于Rewrite的更多設定
9、防禦離線網頁下載下傳和非法網頁爬蟲
有些使用者為了離線檢視網站,例如小說網站等。使用者會利用一些離線工具來抓去網頁并離線到本地,以便使用者 不友善上網的時候可以檢視這些資源。雖然對使用者來說這個體驗不錯,但是對站點來說會導緻嚴重的性能以及 寬帶損耗,影響其他使用者的通路。另外,我們會很奇怪的發現收到各種垃圾郵件。他們是怎麼或者我們的郵箱 位址的呢?其中一種方式便是通過非法的網頁爬蟲來抓取我們的網頁,提取其中的郵箱位址。對于合法的網絡 爬蟲來說,他們一般尊重站點,站點可以通過設定自己的規則來決定是否暴露給爬蟲。例如使用robot.txt來告 訴爬蟲不希望這個站點被檢索到。
對于以上的情況,我們可以通過Apache的Rewrite來進行防禦。
代碼如下:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [OR]
RewriteCond %{HTTP_USER_AGENT} ^Bot\ mailto:[email protected] [OR]
RewriteCond %{HTTP_USER_AGENT} ^ChinaClaw [OR]
RewriteCond %{HTTP_USER_AGENT} ^Custo [OR]
RewriteCond %{HTTP_USER_AGENT} ^DISCo [OR]
RewriteCond %{HTTP_USER_AGENT} ^Download\ Demon [OR]
RewriteCond %{HTTP_USER_AGENT} ^eCatch [OR]
RewriteCond %{HTTP_USER_AGENT} ^EirGrabber [OR]
RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon [OR]
RewriteCond %{HTTP_USER_AGENT} ^EmailWolf [OR]
RewriteCond %{HTTP_USER_AGENT} ^Express\ WebPictures [OR]
RewriteCond %{HTTP_USER_AGENT} ^ExtractorPro [OR]
RewriteCond %{HTTP_USER_AGENT} ^EyeNetIE [OR]
RewriteCond %{HTTP_USER_AGENT} ^FlashGet [OR]
RewriteCond %{HTTP_USER_AGENT} ^GetRight [OR]
RewriteCond %{HTTP_USER_AGENT} ^GetWeb! [OR]
RewriteCond %{HTTP_USER_AGENT} ^Go!Zilla [OR]
RewriteCond %{HTTP_USER_AGENT} ^Go-Ahead-Got-It [OR]
RewriteCond %{HTTP_USER_AGENT} ^GrabNet [OR]
RewriteCond %{HTTP_USER_AGENT} ^Grafula [OR]
RewriteCond %{HTTP_USER_AGENT} ^HMView [OR]
RewriteCond %{HTTP_USER_AGENT} HTTrack [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Image\ Stripper [OR]
RewriteCond %{HTTP_USER_AGENT} ^Image\ Sucker [OR]
RewriteCond %{HTTP_USER_AGENT} Indy\ Library [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^InterGET [OR]
RewriteCond %{HTTP_USER_AGENT} ^Internet\ Ninja [OR]
RewriteCond %{HTTP_USER_AGENT} ^JetCar [OR]
RewriteCond %{HTTP_USER_AGENT} ^JOC\ Web\ Spider [OR]
RewriteCond %{HTTP_USER_AGENT} ^larbin [OR]
RewriteCond %{HTTP_USER_AGENT} ^LeechFTP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mass\ Downloader [OR]
RewriteCond %{HTTP_USER_AGENT} ^MIDown\ tool [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mister\ PiX [OR]
RewriteCond %{HTTP_USER_AGENT} ^Navroad [OR]
RewriteCond %{HTTP_USER_AGENT} ^NearSite [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetAnts [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Net\ Vampire [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetZIP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Octopus [OR]
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Explorer [OR]
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Navigator [OR]
RewriteCond %{HTTP_USER_AGENT} ^PageGrabber [OR]
RewriteCond %{HTTP_USER_AGENT} ^Papa\ Foto [OR]
RewriteCond %{HTTP_USER_AGENT} ^pavuk [OR]
RewriteCond %{HTTP_USER_AGENT} ^pcBrowser [OR]
RewriteCond %{HTTP_USER_AGENT} ^RealDownload [OR]
RewriteCond %{HTTP_USER_AGENT} ^ReGet [OR]
RewriteCond %{HTTP_USER_AGENT} ^SiteSnagger [OR]
RewriteCond %{HTTP_USER_AGENT} ^SmartDownload [OR]
RewriteCond %{HTTP_USER_AGENT} ^SuperBot [OR]
RewriteCond %{HTTP_USER_AGENT} ^SuperHTTP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Surfbot [OR]
RewriteCond %{HTTP_USER_AGENT} ^tAkeOut [OR]
RewriteCond %{HTTP_USER_AGENT} ^Teleport\ Pro [OR]
RewriteCond %{HTTP_USER_AGENT} ^VoidEYE [OR]
RewriteCond %{HTTP_USER_AGENT} ^Web\ Image\ Collector [OR]
RewriteCond %{HTTP_USER_AGENT} ^Web\ Sucker [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebAuto [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebCopier [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebFetch [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebGo\ IS [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebLeacher [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebReaper [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebSauger [OR]
RewriteCond %{HTTP_USER_AGENT} ^Website\ eXtractor [OR]
RewriteCond %{HTTP_USER_AGENT} ^Website\ Quester [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebStripper [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebWhacker [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebZIP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Wget [OR]
RewriteCond %{HTTP_USER_AGENT} ^Widow [OR]
RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus
RewriteRule ^.* - [F,L]
文法已經在上節解釋過了,這裡不再贅述。從上面的代碼中我們可以知道,其實是利用HTTP頭資訊中的User Agent資訊來進行防禦的。User Agent是對浏覽站點裝置的描述,例如可以差別IOS和安卓裝置。但是User Agent是非常容易僞造的。是以,單惡意程式如果把User Agent僞裝成合法的浏覽裝置(例如:chrome等)那麼這裡的規則也就失效了。
10、預設文檔
假如我們的根目錄對應的實體路徑下有一個index.html的檔案。然後我們在浏覽器URL中輸入http://caige.cn 的時候會顯示出index.html的内容。這時候我們就說index.html為目前站點的預設文檔。如果預設文檔為其他檔案的話,應在.htaccess檔案中加入以下指令:
DirectoryIndex index.html index.aspx index.php
多個文檔之間使用空格隔開,伺服器會按照目前的順序來一次尋找文檔,如果找不到就傳回錯誤。
11、增加MIME類型(強制浏覽器下載下傳多媒體檔案)
MIME是(Multipurpose Internet Mail Extensions)的縮寫。他是描述一個檔案是什麼或者描述什麼類型的字尾名對應什麼樣類型的檔案。
使用以下指令可以新增一個字尾名為html0的檔案類型,他描述了html0為字尾的檔案是text或者html檔案。
AddType text/html htm0
當我們遇到mp3檔案或者swf檔案不能被浏覽器播放的時候,可以使用以下配置:
AddType application/x-shockwave-flash swf
另外我們還可以強制浏覽器打開某些檔案的時候打開下載下傳對話框。例如預設情況下,chrome打開圖檔會直接顯示在浏覽器上,我們可以使用以下配置把圖檔的MIME類型強制為application/octet-stream ,這樣就可以強制浏覽器下載下傳圖檔檔案而不是顯示在浏覽器上面。 對mp3、mp4等檔案也可以做同樣的處理。
AddType application/octet-stream jpg
12、開啟SSI子產品
SSI是Server Side Includes 的縮寫。他實質上是一組html标簽,這些标簽裡面包含了一些指令去執行CGI腳本或者加載HTML内容。
一個HTML頁面通常由Header,Body等組成,而且Header裡面有導航,如果我們每個頁面都有包含了相同的代碼,這樣造成了代碼的備援。使用,SSI我們可以把相同的部分抽離出一個檔案,然後用以下代碼包含進來。
這樣需要導航子產品的html頁面隻要使用以上代碼即可包含導航子產品輸出給浏覽器。注意,這裡的路徑是相對路徑。
如果直接再html檔案中加入以上代碼,然後用浏覽器浏覽,你會發現完全沒有效果。應為預設情況下,Apache并沒有為我們開啟SSI。在.htaccess中添加以下代碼:
Options +Includes
AddHandler server-parsed .html
要使用SSI還有一個前提,AllowOverride參數必須設定具有全縣Options和FileInfo,具體設定方法參考第二節,或者直接把AllowOverride設定為All。
解釋:
Options +Includes 告訴Apache伺服器目前.htaccess檔案設定的路徑被允許使用SSI解析。
AddHandler server-parsed .html 設定哪些後最的檔案要使用SSI解析,一般情況下為了不混淆HMTL文檔,會使用.shtml來提到.html
另外SSI還可以使用系統變量,例如輸出目前伺服器時間。甚至,可以執行cmd和exe(在windows平台下)。具體點選這裡檢視SSI更多功能。
13、允許CGI腳本在cgi-bin目錄以外運作
預設情況下Apache接收到cig執行指令的時候隻會在cgi-bin目錄下尋找要執行的腳本,我們可以使用以下指令來允許cgi腳本放在目前站點下:
AddHandler cgi-script .cgi
Options +ExecCGI
14、目錄索引
當使用者一個發出一個請求http://caige.cn/index/的時候,預設情況下Apache會去站點目錄./index下尋找預設文檔(第10節)。如果找不到會傳回一個伺服器錯誤。但是有時候我們需要把目前目錄index下的檔案顯示給使用者,讓使用者去選擇所需要的資源。這個時候我們就要開啟目錄索引功能告訴伺服器開放目前目錄index的檔案清單給使用者檢視。但是,有時候又不想暴露出所有的檔案,例如我想隐藏一些圖檔檔案,那麼可以使用以下配置:
Options +Indexes
IndexIgnore *.jpg *.gif
解釋:
Options +Indexes 表示開啟索引功能,這樣Index檔案夾下的檔案将會在用戶端被列出來
IndexIgnore *.jpg *.gif 表示影藏所有的jpg和gif字尾的檔案,也就是圖檔檔案。
另外,還可以在該目錄下建立兩種文本檔案,一個命名為 HEADER 和 README 。顧名思義,分别是頭部描述檔案和說明檔案。注意這兩個文本檔案沒有字尾名。
用下圖來說明本小節:

我們可以看出Beauty.jpg被隐藏了,另外值得注意的是 HEADER 檔案和 README 檔案可以是html内容,也就是說,伺服器會當他們為html文檔來處理。其中 HEAEDER 的源碼如下:
另外,Beauty.jpg僅僅是在目錄裡面被隐藏了,如果直接通路http://caige.cn/index/Beauty.jpg還是可以通路到圖檔資源的。
點選檢視第二章《Apache配置 之 .htaccess 檔案(二)》
原創内容,轉載請注明出處:http://my.oschina.net/Caige
轉載于:https://my.oschina.net/Caige/blog/322757