.htaccess文件的功能:"分布式配置文件"提供了針對目錄改變配置的方法,即:在一個特定的文檔目錄中放置一個包含一個或多個指令的文件,以作用于此目錄及其所有子目錄。作為用戶,所能使用的命令受到限制。管理員可以通過Apache 的AllowOverride指令來設置.子目錄中的指令會覆蓋更高級目錄或者主服務器配置文件中的指令。
一、錯誤文檔的定位
(1)常用的客戶端請求錯誤返回代碼:
401 Authorization Required 403 Forbidden 404 Not Found 405 Method Not Allowed 408 Request Timed Out 411 Content Length Required 412 Precondition Failed 413 Request Entity Too Long 414 Request URI Too Long 415 Unsupported Media Type
(2)常見的服務器錯誤返回代碼:500 Internal Server Error
一般情況下,人們可以專門設立一個目錄,例如errors放置這些頁面。然后再.htaccess中,加入如下的指令:ErrorDocument 404 /errors/notfound.html ErrorDocument 500 /errors/internalerror.html 一條指令一行。
上述第一條指令的意思是對于404,也就是沒有找到所需要的文檔的時候得顯示頁面為/errors目錄下的notfound.html頁面。不難看出語法格式為:
ErrorDocument 錯誤代碼 /目錄名/文件名.擴展名
如果所需要提示的信息很少的話,不必專門制作頁面,直接在指令中使用HTML號了,例如下面這個例子:
ErrorDocument 401 "
你沒有權限訪問該頁面!
"
二、文檔訪問的密碼保護要利用.htaccess對某個目錄下的文檔設定訪問用戶和對應的密碼,首先要做的是生成一個.htpasswd的文本文檔,例如:
zheng:y4E7Ep8e7EYV
這里密碼經過加密,用戶可以自己找些工具將密碼加密成.htaccess支持的編碼。該文檔最好不要放在www目錄下,建議放在www根目錄文檔之外,這樣更為安全些。
有了授權用戶文檔,可以在.htaccess中加入如下指令了:
AuthUserFile .htpasswd的服務器目錄 AuthGroupFile /dev/null (需要授權訪問的目錄) AuthName EnterPassword AuthType Basic (授權類型)
require user wsabstract (允許訪問的用戶,如果希望表中所有用戶都允許,可以使用 require valid-user)
注:括號部分為學習時候自己添加的注釋
三、拒絕來自某個IP的訪問
如果我不想某個政府部門訪問到我的站點的內容,那可以通過.htaccess中加入該部門的IP而將它們拒絕在外。 例如:
order allow,deny deny from 210.21.112.43deny from 219.146.95 allow from all
注: 第二行拒絕某個IP,第三行拒絕某個IP段,也就是219.146.95.0~219.146.95.255 想要拒絕所有人?用deny from all好了。不止用IP,也可以用域名來設定。
四、保護.htaccess文檔
在使用.htaccess來設置目錄的密碼保護時,它包含了密碼文件的路徑。從安全考慮,有必要把.htaccess也保護起來,不讓別人看到其中的內容。雖然可以用其他方式做到這點,比如文檔的權限。不過,.htaccess本身也能做到,只需加入如下的指令:
我們可能對網站進行重新規劃,將文檔進行了遷移,或者更改了目錄。這時候,來自搜索引擎或者其他網站鏈接過來的訪問就可能出錯。這種情況下,可以通過如下指令來完成舊的URL自動轉向到新的地址:
Redirect /舊目錄/舊文檔名 新文檔的地址 或者整個目錄的轉向: Redirect 舊目錄 新目錄 改變缺省的首頁文件
一般情況下缺省的首頁文件名有default、index等。不過,有些時候目錄中沒有缺省文件,而是某個特定的文件名,比如在pmwiki中是pmwiki.php。這種情況下,要用戶記住文件名來訪問很麻煩。在.htaccess中可以輕易的設置新的缺省文件名:
DirectoryIndex 新的缺省文件名
也可以列出多個,順序表明它們之間的優先級別,例如:
DirectoryIndex filename.html index.cgi index.pl default.htm
在配置Apache時,除了可以在主配置文件(http.conf)中配置訪問控制之外,還可以使用.htaccess 文件配置對指定目錄的訪問控制。使用.htaccess文件可以改變主配置文件中的配置,但是它只能設置對指定目錄的訪問控制,這個目錄就是.htaccess文件存放的目錄。在一個目錄下設置了.htaccess文件之后,當用戶使用瀏覽器訪問此目錄時,Apache會讀取該文件的配置來覆蓋主配置文件(http.conf)的配置。
注意:1.修改.htaccess文件無需重新啟動Apache服務器,而是立即生效。
2.在可能的情況下應該盡量避免使用.htaccess文件,因為使用.htaccess文件會降低服務器的運行性能。
何時使用.htaccess文件:
有如下兩種情況需要使用.htaccess文件:
*在多個用戶之間分割配置
*想在不重新啟動服務器的情況下改變服務器配置
使用.htaccess文件必須經過兩個配置步驟:
*首先在主配置文件中的啟用并控制對.htaccess文件的使用
*然后在需要覆蓋主配置文件的目錄下生成.htaccess文件
在主配置文件中的啟用并控制對.htaccess文件的使用
1.設置文件名稱必須保證在主配置文件中包含如下的配置語句:
- AccessFileName .htaccess
- Order allow,deny
- Deny from all
2.控制在.htaccess文件中可以使用的指令組
要控制在.htaccess文件中可以使用的指令組,需要在主配置文件中使用AllowOverride指令。下面列出了可以在AllowOverride指令所使用的指令組。
指令組 可用指令 說明
- AuthConfig
- AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require
進行認證、授權以及安全的相關指令
- FileInfo
- DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter
控制文件處理方式的相關指令
- Indexes
- AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName
控制目錄列表方式的相關指令
- Limit
- Allow,Deny,Order
進行目錄訪問控制的相關指令
- Options
- Options, XBitHack
啟用不能在主配置文件中使用的各種選項
All
全部指令組
可以使用以上所有指令
None
禁止使用所有指令
禁止處理.htaccess文件
3、生成.htaccess文件
當在主配置文件中配置了對.htaccess文件的啟用和控制之后,接下來就可以在需要覆蓋主配置文件的目錄下生成.htaccess文件。.htaccess文件中可以使用的配置指令取決于主配置文件中AllowOverride指令的設置。
4、使用.htaccess文件舉例
下面舉一個簡單的例子說明.htaccess文件的使用。
- //首先在文檔根目錄下生成一個private目錄,并創建測試文件
- # cd /var/www/html
- # mkdir private
- # cd private
- # touch test
- //修改配置前,在客戶瀏覽器查看結果。
- //修改主配置文件
- # vi /etc/httpd/conf/httpd.conf
- //添加如下配置語句
var /www/html/private”>- AllowOverride Options
- #
- //重新啟動httpd
- # service httpd restart
- //在/var/www/html/private目錄下生成.htaccess文件
- # vi /var/www/html/private/.htaccess
- //添加如下配置語句
- Options –Indexes
- #
- //在客戶瀏覽器中查看結果。
- //即對private目錄的訪問不生成文件列表
三、.htaccess文件的配置說明
Apache可以使用分布在整個網頁結構中的特殊文件來進行配置,這些特殊文件通常叫.htaccess,也可以用AccessFileName指令來改變。.htaccess 文件中的指令的作用域是存放它的那個目錄及其所有子目錄。.htaccess 文件的語法與主配置文件相同。由于對每次請求都會讀取.htaccess 文件,所以對這些文件的改變會立即生效。
可以查閱Context了解可以放在.htaccess文件中的指令;服務器管理員可以通過AllowOverride指令,來決定.htaccess 文件中可以生效的指令。
.htaccess 文件(或者”分布式配置文件”)提供了針對目錄改變配置的方法,即在一個特定的文檔目錄中放置一個包含一個或多個指令的文件,以作用于此目錄及其所有子目錄。作為用戶,所能使用的命令受到限制。管理員可以通過Apache的AllowOverride指令來設置。
子目錄中的指令會覆蓋更高級目錄或者主服務器配置文件中的指令。
- .htaccess必須以ASCII模式上傳,最好將其權限設置為644。
1、錯誤文檔的定位
常用的客戶端請求錯誤返回代碼:
- 401 Authorization Required
- 403 Forbidden
- 404 Not Found
- 405 Method Not Allowed
- 408 Request Timed Out
- 411 Content Length Required
- 412 Precondition Failed
- 413 Request Entity Too Long
- 414 Request URI Too Long
- 415 Unsupported Media Type
常見的服務器錯誤返回代碼:
500 Internal Server Error
用戶可以利用.htaccess指定自己事先制作好的錯誤提醒頁面。一般情況下,人們可以專門設立一個目錄,例如errors放置這些頁面。然后再.htaccess中,加入如下的指令:
- ErrorDocument 404 /errors/notfound.html
- ErrorDocument 500 /errors/internalerror.html
一條指令一行。上述第一條指令的意思是對于404,也就是沒有找到所需要的文檔的時候得顯示頁面為/errors目錄下的notfound.html頁面。不難看出語法格式為:
ErrorDocument 錯誤代碼 /目錄名/文件名.擴展名
如果所需要提示的信息很少的話,不必專門制作頁面,直接在指令中使用HTML號了,例如下面這個例子:
ErrorDocument 401 “你沒有權限訪問該頁面,請放棄!”
2、文檔訪問的密碼保護
要利用.htaccess對某個目錄下的文檔設定訪問用戶和對應的密碼,首先要做的是生成一個.htpasswd的文本文檔,例如:martin:123456
這里密碼經過加密,用戶可以自己找些工具將密碼加密成.htaccess支持的編碼。該文檔最好不要放在www目錄下,建議放在www根目錄文檔之外,這樣更為安全些。
有了授權用戶文檔,可以在.htaccess中加入如下指令了:
AuthUserFile .htpasswd的服務器目錄
AuthGroupFile /dev/null (需要授權訪問的目錄)
AuthName EnterPassword
AuthType Basic (授權類型)
require user wsabstract (允許訪問的用戶,如果希望表中所有用戶都允許,可以使用 require valid-user)
3、拒絕來自某個IP的訪問
如果我不想某個政府部門訪問到我的站點的內容,那可以通過.htaccess中加入該部門的IP而將它們拒絕在外。例如:
- order allow,deny
- deny from 210.10.56.32
- deny from 219.5.45.
- allow from all
第二行拒絕某個IP,第三行拒絕某個IP段,也就是219.5.45.0~219.2.45.255。想要拒絕所有人?用deny from all好了。不止用IP,也可以用域名來設定。
4、保護.htaccess文檔
在使用.htaccess來設置目錄的密碼保護時,它包含了密碼文件的路徑。從安全考慮,有必要把.htaccess也保護起來,不讓別人看到其中的內容。雖然可以用其他方式做到這點,比如文檔的權限。不過,.htaccess本身也能做到,只需加入如下的指令:
order allow,deny deny from all
5、URL轉向
我們可能對網站進行重新規劃,將文檔進行了遷移,或者更改了目錄。這時候,來自搜索引擎或者其他網站鏈接過來的訪問就可能出錯。這種情況下,可以通過如下指令來完成舊的URL自動轉向到新的地址:
Redirect /舊目錄/舊文檔名 新文檔的地址或者整個目錄的轉向:
Redirect 舊目錄 新目錄
6、改變缺省的首頁文件
一般情況下缺省的首頁文件名有default、index等。不過,有些時候目錄中沒有缺省文件,而是某個特定的文件名,比如在pmwiki中是pmwiki.php。這種情況下,要用戶記住文件名來訪問很麻煩。在.htaccess中可以輕易的設置新的缺省文件名:
DirectoryIndex 新的缺省文件名,也可以列出多個,順序表明它們之間的優先級別,例如:DirectoryIndex filename.html index.cgi index.pl default.htm
7. 使用.htaccess 訪止盜鏈。如果你網站上的一個圖片被別的N多的網站引用了,那么,這很有可能會導致你服務器的性能下降,使用下面的代碼可以保護某些熱門的鏈接不被過多的引用。
- Options +FollowSymlinks
- # Protect Hotlinking
- RewriteEngine On
- RewriteCond %{HTTP_REFERER} !^$
- RewriteCond %{HTTP_REFERER} !^http://(www.)?domainname.com/ [nc]
- RewriteRule .*.(gif|jpg|png)$ http://domainname.com/img/hotlink_f_o.png [nc]
8. 設置網站的時區 SetEnv TZ America/Houston
9. 阻止IP列表
有些時候,你需要以IP地址的方式阻止一些訪問。無論是對于一個IP地址還是一個網段,這都是一件非常簡單的事情,如下所示:
- allow from all
- deny from 145.186.14.122
- deny from 124.15
- Apache對于被拒絕的IP會返回403錯誤。
10. 把一些老的鏈接轉到新的鏈接上——搜索引擎優化SEO
Redirect 301 /d/file.html http://www.htaccesselite.com/r/file.html
11. 為服務器管理員設置電子郵件。
ServerSignature EMail
SetEnv SERVER_ADMIN default@domain.com
12. 阻止 User Agent 的所有請求
- ## .htaccess Code :: BEGIN
- ## Block Bad Bots by user-Agent
- SetEnvIfNoCase user-Agent ^FrontPage [NC,OR]
- SetEnvIfNoCase user-Agent ^Java.* [NC,OR]
- SetEnvIfNoCase user-Agent ^Microsoft.URL [NC,OR]
- SetEnvIfNoCase user-Agent ^MSFrontPage [NC,OR]
- SetEnvIfNoCase user-Agent ^Offline.Explorer [NC,OR]
- SetEnvIfNoCase user-Agent ^[Ww]eb[Bb]andit [NC,OR]
- SetEnvIfNoCase user-Agent ^Zeus [NC]
- Order Allow,Deny
- Allow from all
- Deny from env=bad_bot
- ## .htaccess Code :: END
13. 把某些特殊的IP地址的請求重定向到別的站點
- ErrorDocument 403 http://www.youdomain.com
- Order deny,allow
- Deny from all
- Allow from ip
- Allow from ip
14. 直接找開文件而不是下載 – 通常,我們打開網上文件的時候總是會出現一個對話框問我們是下載還是直接打開,使用下面的設置就不會出現這個問題了,直接打開。
- AddType application/octet-stream .pdf
- AddType application/octet-stream .zip
- AddType application/octet-stream .mov
15. 修改文件類型 – 下面的示例可以讓任何的文件都成為PHP那么被服務器解釋。比如:myphp, cgi,phtml等。
ForceType application/x-httpd-php
SetHandler application/x-httpd-php
- # secure htaccess file
- order allow,deny
- deny from all
- # prevent access of a certain file order allow,deny
- deny from all
18. 阻止目錄瀏覽
- # disable directory browsing
- Options All -Indexes
19. 口令認證 – 你可以創建一個文件用于認證。下面是一個示例:
- # to protect a file
- AuthType Basic
- AuthName “Prompt”
- AuthUserFile /home/path/.htpasswd
- Require valid-user
- # password-protect a directory
- resides
- AuthType basic
- AuthName “This directory is protected”
- AuthUserFile /home/path/.htpasswd
- AuthGroupFile /dev/null
- Require valid-user
配置apache支持.htaccess
gksu gedit /etc/apache2/sites-available/default
先介紹默認配置,代碼:
- Options Indexes FollowSymLinks MultiViews
- AllowOverride None
- Order allow,deny
- allow from all
Options Indexes FollowSymLinks MultiViews 中
Indexed指當沒能找到默認網頁(如index.htm等)時,將目錄內容生成為含子目錄、文件超鏈接列表的網頁;
FollowSymLinks指若文件系統存在鏈接,則用URL訪問時也可按鏈接訪問,即若你創建目錄A的鏈接文件到目錄B,在B下雙擊鏈接文件A就可進入A,同樣也可以在URL中用http://….B/A來訪問A;
MultiViews大致指服務器端可以根據實際情況進行配置,如在目錄下找不到index.htm時會自動尋找index.php,使用同上次訪問的某些設置。
AllowOverride 指目錄及其子目錄是否可以用.htaccess文件控制訪問權限
Order allow,deny 指Allow指令在 Deny指令之前被評估。缺省禁止所有訪問。任何不匹配Allow指令或者匹配 Deny指令的客戶都將被禁止訪問服務器。
解決辦法,在里面添加代碼:
- AllowOverride All
- Order allow,deny
- allow from 127.0.0.1
首先的目錄路徑是apache實際訪問時的路徑,因為我是給phpmyadmin做了一個鏈接到/var/www/,所以apache訪問phpmyadmin是通過/var/www/phpmyadmin而不是/usr/share/phpmyadmin。而且如果你在多處用了鏈接,如還有目錄鏈接/var/www/admin/phpmyadmin,你就要再寫一個
其次,因為/var/www設置了allow from all,如果我們只想讓本機訪問phpmyadmin,那就要覆蓋掉原設置,代碼:
- Order allow,deny
- allow from 127.0.0.1
還要設置phpmyadmin及其子目錄允許.htaccess文件控制訪問權限代碼:
AllowOverride All
apache相關命令
關閉apache代碼:sudo /usr/sbin/apache2ctl stop
重啟apache(有時候重啟不會改變設置,要先關閉、再啟動)代碼:
sudo /usr/sbin/apache2ctl restart
重啟firefox、apache再訪問就起效了。
如果phpmyadmin啟用了.htaccess權限控制,沒有在上級目錄列表中出現,就通過URL直接訪問http://localhost/phpmyadmin
新聞熱點
疑難解答