在windows系統下,下無法将 htaccess.txt 重命名為 .htaccess,怎麼辦?很簡單,用記事本打開,htaccess.txt, 然後再選擇"另存為"的方式,就可以重命名為.htaccess了 .htaccess 檔案是apache伺服器中最常用的一個配置檔案,它負責相關目錄下的網頁配置。通過 htaccess檔案,可以幫我們實作:網頁301重定向、自定義404錯誤頁面、改變檔案擴充名、允許/阻止特定的使用者或者目錄的通路、禁止目錄清單、 配置索引入口等功能。
1. 開啟網站的圖檔防盜鍊功能
如果網站的流量有限,那麼圖檔防盜鍊是非常必要的。不僅可以減少流量浪費,而且可以減輕伺服器負擔。開啟圖檔防盜鍊功能需要在htaccess檔案中加入以下代碼:

rewriteengine on
rewritecond %{http_referer} !^$
rewritecond %{http_referer} !^http://(www\.)?allow1.com(/)?.*$ [nc]
rewritecond %{http_referer} !^http://(www\.)?allow2.com(/)?.*$ [nc]
rewriterule .*\.(gif|jpg|jpeg|bmp|png)$ [r,nc,l]
上面的代碼中,allow1.com與allow2.com分别是允許通路網站圖檔的域名,後面的baidu.com則是替換成的目标圖檔地 址。上面還包含了圖檔檔案的字尾參數,可以自行更改。如果通過htaccess線上生成器生成此段代碼,僅僅需要填寫幾個允許通路的域名(不帶www與 http),然後再填寫好準備替換的圖檔位址。
2、自定義404、500等錯誤傳回頁
如果你不希望網站在找不到網頁的時候出現“404該頁無法顯示”,就試試自己定義一個找不到網頁的出錯頁面吧!需要在htaccess檔案中加入

errordocument 404/404.htm
前面的404是其錯誤代号,後面的/404.htm是自己定義的404頁面的路徑。需要注意的是,如果這個404頁面的大小小于512b,則 ie會忽略此頁面,也就不會生效了。後面的參數需要使用網站相對路徑。在htaccess線上生成程式中,請切換到“自定義錯誤頁面”頁籤,然後在 “404(未找到)”後面的輸入框中輸入你的錯誤頁面位址即可。線上生成工具還可以處理其它類型的錯誤,以此類推即可。請預先将404錯誤頁面制作好上傳 到網站目錄。
4、預設入口頁面
有些虛拟主機就是另類,不适用預設的檔案名,或順序非主流。那麼通過以下的代碼就可以自己定義這個頁面的檔案名了。比如index.htm 、default.php等等:

directoryindex index.php
這行代碼将index.php作為預設首頁。其他頁面請直接替換例子中的index.php。如果網站有多個頁面需要作為首頁,請按照 directoryindex index.html index.htm index.php的格式編寫檔案。這樣優先級的順序為 index.html > index.htm > index.php此項設定在htaccess生成器中,僅僅需要你依次填入首頁的檔案名即可,非常友善。
5、通過htaccess開啟網站圖檔緩存
某些虛拟主機限制了網站的流量,如果浏覽器每次都從伺服器下載下傳最常用的圖檔檔案,将會浪費大量的帶寬。是以可以開啟圖檔緩存,浏覽器在緩存過期前将會自動從緩存區載入圖檔檔案。此功能在檔案中加入以下代碼:

header set cache-control "max-age=3600"
需要注意的是,上面的3600機關為秒,即逾時時間,上圖中的gif等為圖檔檔案字尾,表示對這些檔案生效。如果使用自動生成工具,為了開啟此選項,請将“開啟站點的圖檔緩存”頁籤選擇一個逾時時間。目前有十分鐘、一小時、一天等選項可供設定。
6針對url相對路徑的禁止通路:

<location /dir/>
order allow,deny
deny from all
</location>
7、固定301、302網頁重定向
由于頁面轉移位置造成的404錯誤是我們大家都非常頭痛的問題,但我們隻需要做一個301的重定向就會完全解決這個問題了。在htaccess檔案中加入以下代碼:

redirect permanent /old.htm http://www.php100.com
前面一個參數使用相對路徑,也可以使用目錄名,後一個參數必須填寫完整網址。這樣才能生效,并且不出錯誤。在seo中,搜尋引擎也很快就會按照你的設定,将收錄的網頁更新。
8.阻止/允許特定的ip位址
某 些情況下,你可能隻想允許某些特定ip的使用者可以通路你的網站(例如:隻允許使用特定isp的使用者進入某個目錄),或者想封禁某些特定的ip位址(例如: 将低級使用者隔離于你的資訊版面外)。當然,這隻在你知道你想攔截的ip位址時才有用,然而現在網上的大多數使用者都使用動态ip位址,是以這并不是限制使用 的常用方法。
你可以使用以下指令封禁一個ip位址:

deny from 000.000.000.000
這裡的000.000.000.000是被封禁的ip位址,如果你隻指明了其中的幾個,則可以封禁整個網段的位址。如你輸入210.10.56.,則将封禁210.10.56.0~210.10.56.255的所有ip位址。
你可以使用以下指令允許一個ip位址通路網站:

allow from 000.000.000.000
被允許的ip位址則為000.000.000.000,你可以象封禁ip位址一樣允許整個網段。
如果你想阻止所有人通路該目錄,則可以使用:

deny from all
不過這并不影響腳本程式使用這個目錄下的文檔。
9.密碼保護
introduction 介紹
密碼保護的.htaccess檔案
利用.htaccess将一個目錄加上密碼保護分兩個步驟。第一步是在你的.htaccess文檔裡加上适當的幾行代碼,再将.htaccess文檔放進你要保護的目錄下:

authname “section name”
authtype basic
authuserfile /full/path/to/.htpasswd
require valid-user
你可能需要根據你的網站情況修改一下上述内容中的一些部分,如用被保護部分的名字”members area”,替換掉“section name”。
/full/parth/to/.htpasswd則應該替換為指向.htpasswd檔案(後面詳述該文檔)的完整伺服器路徑。如果你不知道你網站空間的完整路徑,請詢問一下你的系統管理者。
密碼保護的.htpasswd檔案
目錄的密碼保護比.htaccess的其他功能要麻煩些,因為你必須同時建立一個包含使用者名和密碼的文檔,用于通路你的網站,相關資訊(預設)位于一個名 為.htpasswd的文檔裡。像.htaccess一樣,.htpasswd也是一個沒有檔案名且具有8位擴充名的文檔,可以放置在你網站裡的任何地方 (此時密碼應加密),但建議你将其儲存在網站web根目錄外,這樣通過網絡就無法通路到它了。
輸入使用者名和密碼
建立好.htpasswd文檔後(可以通過文字編輯器建立),下一步是輸入用于通路網站的使用者名和密碼,應為:
username:password
“password”的位置應該是加密過的密碼。你可以通過幾種方法來得到加密過的密碼:一是使用一個網上提供的permade腳本或自己寫一個;另一個 很不錯的username/password加密服務是通過kxs網站,這裡允許你輸入使用者名及密碼,然後生成正确格式的密碼。
對于多使用者,你隻需要在.htpasswd文檔中新增同樣格式的一行即可。另外還有一些免費的腳本程式可以友善地管理.htpasswd文檔,可以自動新增/移除使用者等。
通路網站
當你試圖通路被.htaccess密碼保護的目錄時,你的浏覽器會彈出标準的username/password對話視窗。如果你不喜歡這種方式,有些腳 本程式可以允許你在頁面内嵌入username/password輸入框來進行認證,你也可以在浏覽器的url框内以以下方式輸入使用者名和密碼(未加密 的):
http://username:[email protected]/directory/
10.禁止檔案通路

<filesmatch (.*)\.htm$>
order allow,deny
deny from all
</filesmatch>
現在伺服器将隻允許通路模版目錄下的非htm檔案,通路htm檔案時會提示403錯誤
此外,htaccess還可以實作比如mime檔案類型修改、域名重定向等功能,是以,能充分利用好該檔案将能讓你的網站建設更加得心應手。
rewritecond 重寫規則執行條件
文法: rewritecond teststring condpattern
生效域: server config, virtual host, directory, .htaccess
特别的上面的 teststring, 可提供反向引用. 引用模式為: %n 其中n為(0 <= n <=9), 引用目前若幹rewritecond條件中最後符合的條件中的分組成分, 也就是括号裡的内容.不過用到的不多. 反向應用多在rewriterule裡常用.
rewritecond 文法中的 teststrng 為要被檢查的内容, condpattern 是進行比對的規則, 它是一個相容perl風格的正規表達式和一些其他的特有字元屬性. 這裡介紹一下.
第一個: ! (感歎号) 表示否的意思. 比如一個條件: 判斷通路此頁面的上一頁url是否包含 sex 字元的話可以用這樣: rewritecond %{http_referer} !(sex)
第二個: < 就是小于的意思, teststring < condpattern.
第三個: > 就是大于于的意思, teststring < condpattern.
第四個: = 相等的意思. <, >, = 三個和通常程式語言使用的 <, >, = 功能類似.
第五個: -d 是否是一個目錄. 判斷teststring是否不是一個目錄可以這樣: !-d
第六個: -f 是否是一個檔案. 判斷teststring是否不是一個檔案可以這樣: !-f
第七個: -s 是否是一個正常的有大小的檔案. 判斷teststring是否不是一個正常的有大小的檔案可以這樣: !-s
第八個: -l 是否是一個快捷方式檔案. 判斷teststring是否不是一個快捷方式檔案可以這樣: !-l
第九個: -x 是否是一個檔案并且又執行權限. 判斷teststring是否不是一個檔案并且又執行權限可以這樣: !-x
第十個: -f 檢查teststring是否是一個合法的檔案,而且通過伺服器範圍内的目前設定的通路控制進行通路。這個檢查是通過一個内部subrequest完成的, 是以需要小心使用這個功能以降低伺服器的性能。
第十一個: -u 檢查teststring是否是一個合法的url,而且通過伺服器範圍内的目前設定的通路控制進行通路。這個檢查是通過一個内部subrequest完成的, 是以需要小心使用這個功能以降低伺服器的性能.
另外: rewritecond 指令後面可帶 flag, 現在隻要2個可用, 一個是 nc|nocase, 不區分大小寫的意思. 一個是 or|ornext 表示連接配接下一個條件的意思.
rewritecond 實際需要使用情況比如要判斷一個條件成真的時候才執行相關的重寫操作. 緊接着它下面的 rewriterule 總是在rewritecond 條件判斷為真的時候才被執行.
例.賽卡軟體近期更換了域名,新域名為www.sicasoft.com, 更加簡短好記。這時需要将原來的域名ss.kiya.cn, 以及論壇所在位址ss.kiya.cn/bbs/定向到新的域名,以便使用者可以找到,并且使原來的論壇 url 繼續有效而不出現 404 未找到,比如原來的http://ss.kiya.cn/bbs/tread-60.html, 讓它在新的域名下繼續有效,點選後轉發到http://bbs.sicasoft.com/tread-60.html,而其他網頁,如原先的http: //ss.kiya.cn/purchase不會到二級域名bbs.sicasoft.com/purchase上,而是到 www.sicasoft.com/purchase
按照這樣的要求重定向規則應該這樣寫:

rewriteengine on
rewritecond %{request_uri} ^/bbs/
rewriterule ^bbs/(.*) http://bbs.sicasoft.com/$1 [r=permanent,l]
rewritecond %{request_uri} !^/bbs/
rewriterule ^(.*) http://www.sicasoft.com/$1 [r=permanent,l]
apache mod_rewrite規則重寫的标志一覽
1) r[=code](force redirect) 強制外部重定向
強制在替代字元串加上http://thishost[:thisport]/字首重定向到外部的url.如果code不指定,将用預設的302 http狀态碼。
2) f(force url to be forbidden)禁用url,傳回403http狀态碼。
3) g(force url to be gone) 強制url為gone,傳回410http狀态碼。
4) p(force proxy) 強制使用代理轉發。
5) l(last rule) 表明目前規則是最後一條規則,停止分析以後規則的重寫。
6) n(next round) 重新從第一條規則開始運作重寫過程。
7) c(chained with next rule) 與下一條規則關聯
如果規則比對則正常處理,該标志無效,如果不比對,那麼下面所有關聯的規則都跳過。
8) t=mime-type(force mime type) 強制mime類型
9) ns (used only if no internal sub-request) 隻用于不是内部子請求
10) nc(no case) 不區分大小寫
11) qsa(query string append) 追加請求字元串
12) ne(no uri escaping of output) 不在輸出轉義特殊字元,例如:rewriterule /foo/(.*) /bar?arg=p1\%3d$1 [r,ne] 将能正确的将/foo/zoo轉換成/bar?arg=p1=zed
13) pt(pass through to next handler) 傳遞給下一個處理例如:
rewriterule ^/abc(.*) /def$1 [pt] # 将會交給/def規則處理
alias /def /ghi
14) s=num(skip next rule(s)) 跳過num條規則
15) e=var:val(set environment variable) 設定環境變量

/type.php?typeid=* –> /type*.html
/type.php?typeid=*&page=* –> /type*page*.html
rewriterule ^/type([0-9]+).html$ /type.php?typeid=$1 [pt]
rewriterule ^/type([0-9]+)page([0-9]+).html$ /type.php?typeid=$1&page=$2 [pt]
為了安全一般線上伺服器都會選擇隐藏目前webserver的版本,如何隐藏nginx apache php版本?
1.隐藏php版本号
隐藏方法:vim php.ini添加如下代碼 expose_php = off
2.隐藏nginx版本号
隐藏方法:vim nginx.conf 在http裡加入sever_tokens= off
3.隐藏apache版本号
隐藏方法:vim httpd.ini 添加如下代碼
1. servertokens = productonly
2. serversignature = off
修改每個配置檔案都要重新開機服務才可以生效。
僞靜态配置
1.loadmodule rewrite_module modules/mod_rewrite.so去了注釋(去了最前面的#)
2.虛拟改目錄配置

<directory />
options followsymlinks
allowoverride all
order deny,allow
deny from all
</directory>
3.在根目錄下建.htaccess(你可以用記事本打,然後另存為就ok了)
4.配制規則(在.htaccess檔案中貼上)

<ifmodule mod_rewrite.c>
rewritebase /
rewriterule ^t_(.*).html$ test.php?id=$1
</ifmodule>
5.測試位址欄裡輸入 t_1.html在test.php輸出1就對了 。
apahce 本身可以簡單設置一下無需配置 rewrite:
下面是我的httpd.conf中站點目錄的配置.主要是 options indexes followsymlinks multiviews 參數;multiviews的效果是:如果伺服器收到對/some/dir/foo的請求,而/some/dir/foo并不存在,但是如果/some/dir 啟用了multiviews ,則伺服器會查找這個目錄下所有的foo.* 檔案,并有效地僞造一個說明這些foo.* 檔案的類型表,配置設定給他們相同的媒體類型及内容編碼,并選擇其中最合适的比對傳回給客戶
admin指向admin.php

options +followsymlinks
rewriterule ^admin/$ admin.php [l]
将非特定的重寫到index.php
将404重寫到index.php

rewriterule !\.(jpg|png|gif|html|css|js|xml|swf)$ index.php
errordocument 404 index.php