.htaccess是什么
啟用.htaccess,需要修改httpd.conf,啟用AllowOverride,并可以用AllowOverride限制特定命令的使用。如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令來(lái)改變。例如,需要使用.config ,則可以在服務(wù)器配置文件中按以下方法配置:AccessFileName .config。
籠統(tǒng)地說(shuō),.htaccess可以幫我們實(shí)現(xiàn)包括:文件夾密碼保護(hù)、用戶自動(dòng)重定向、自定義錯(cuò)誤頁(yè)面、改變你的文件擴(kuò)展名、封禁特定IP地址的用戶、只允許特定IP地址的用戶、禁止目錄列表,以及使用其他文件作為index文件等一些功能。
工作原理
.htaccess文件(或者”分布式配置文件”)提供了針對(duì)每個(gè)目錄改變配置的方法即在一個(gè)特定的目錄中放置一個(gè)包含指令的文件其中的指令作用于此目錄及其所有子目錄。
說(shuō)明:
如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令來(lái)改變。例如,需要使用.config ,則可以在服務(wù)器配置文件中按以下方法配置:
AccessFileName .config
通常,.htaccess文件使用的配置語(yǔ)法和主配置文件一樣。AllowOverride指令按類別決定了.htaccess文件中哪些指令才是有效的。如果一個(gè)指令允許在.htaccess中使用,那么在本手冊(cè)的說(shuō)明中,此指令會(huì)有一個(gè)覆蓋項(xiàng)段,其中說(shuō)明了為使此指令生效而必須在AllowOverride指令中設(shè)置的值。
htaccess語(yǔ)法教程
RewriteEngine On RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ RewriteCond %{REQUEST_URI} !^/blog/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /blog/$1 # 沒(méi)有輸入文件名的默認(rèn)到到首頁(yè) RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ RewriteRule ^(/)?$ blog/index.php [L]
【RewriteEngine On】
表示重寫引擎開,關(guān)閉off,作用就是方便的開啟或關(guān)閉以下的語(yǔ)句,這樣就不需要一條一條的注釋語(yǔ)句了。
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
這是重寫條件,前面%{HTTP_HOST}表示當(dāng)前訪問(wèn)的網(wǎng)址,只是指前綴部分,格式是www.xxx.com不包括“http://”和“/”,^表示 字符串開始,$表示字符串結(jié)尾,\.表示轉(zhuǎn)義的. ,如果不轉(zhuǎn)義也行,推薦轉(zhuǎn)義,防止有些服務(wù)器不支持,?表示前面括號(hào)www\.出現(xiàn)0次或1次,這句規(guī)則的意思就是如果訪問(wèn)的網(wǎng)址是xxx.com或者 www.xxx.com就執(zhí)行以下的語(yǔ)句,不符合就跳過(guò)。
【RewriteCond %{REQUEST_URI} !^/blog/】
也是重寫條件,%{REQUEST_URI}表示訪問(wèn)的相對(duì)地址,就是相對(duì)根目錄的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,這句語(yǔ)句表示訪問(wèn)的地址不以/blog/開頭,只是開頭^,沒(méi)有結(jié)尾$
【RewriteCond %{REQUEST_FILENAME} !-f】
【RewriteCond %{REQUEST_FILENAME} !-d】
這兩句語(yǔ)句的意思是請(qǐng)求的文件或路徑是不存在的,如果文件或路徑存在將返回已經(jīng)存在的文件或路徑
【RewriteRule ^(.*)$ /blog/$1】
重寫規(guī)則,最重要的部分,意思是當(dāng)上面的RewriteCond條件都滿足的時(shí)候,將會(huì)執(zhí)行此重寫規(guī)則,^(.*)$是一個(gè)正則表達(dá)的 匹配,匹配的是當(dāng)前請(qǐng)求的URL,^(.*)$意思是匹配當(dāng)前URL任意字符,.表示任意單個(gè)字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重寫成分,意思是將前面匹配的字符重寫成/blog/$1,這個(gè)$1表示反向匹配,引用的是前面第一個(gè)圓括號(hào)的成分,即^(.*)$中 的.* ,其實(shí)這兒將會(huì)出現(xiàn)一個(gè)問(wèn)題,后面討論。
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
【RewriteRule ^(/)?$ blog/index.PHP [L]】
這兩句的意思是指請(qǐng)求的host地址是www.xxx.com是,如果地址的結(jié)尾只有0個(gè)或者1個(gè)“/”時(shí),將會(huì)重寫到子目錄下的主頁(yè),我猜想這主要因?yàn)橹貙懞蟮牡刂肥遣荒茏詣?dòng)尋找主頁(yè)的,需要自己指定。
現(xiàn)在說(shuō)說(shuō)出現(xiàn)的問(wèn)題,RewriteRule ^(.*)$ /blog/$1 前部分 ^(.*)$ 將會(huì)匹配當(dāng)前請(qǐng)求的url。
例如:請(qǐng)求網(wǎng)址是http://www.xxx.com/a.html,到底是匹配整個(gè)http://www.xxx.com/a.html,還是只匹配/a.html即反斜杠后面的成分,還是只匹配a.html。
答案是:根據(jù)RewriteBase規(guī)則規(guī)定,如果rewritebase 為/,將會(huì)匹配a.html,不帶前面的反斜杠,所以上條語(yǔ)句應(yīng)該寫成RewriteRule ^(.*)$ blog/$1(不帶/),不過(guò)實(shí)際應(yīng)用上帶上前面的反斜杠,也可以用,可能帶不帶都行?,F(xiàn)在問(wèn)題出來(lái)了,如果不設(shè)置rewritebase 為/ ,將會(huì)匹配整個(gè)網(wǎng)址http://www.xxx.com/a.html,顯然這是錯(cuò)誤的,所以應(yīng)該添加這條:RewiteBase /
屏蔽IP
禁止特定的IP
order allow,deny allow from all deny from 1.1.1.1 ;寫要封的IP 只允許特定的IP訪問(wèn) order deny,allow deny from all allow from 61.228.209.85 主域名指向子目錄 RewriteEngine on RewriteCond %{HTTP_HOST} ^(www.)?yourmaindomain.com$ RewriteCond %{REQUEST_URI} !^/subfolder/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /subfolder/$1 RewriteCond %{HTTP_HOST} ^(www.)?yourmaindomain.com$ RewriteRule ^(/)?$ subfolder/index.php [L] 防止.htaccess文件被查看order allow,deny deny from all
其他文件也可以類似這樣處理
規(guī)范www
全部統(tǒng)一到帶 www,例如將cnwenhui.cn 統(tǒng)一到 www.geizy.cn
RewriteEngine on RewriteCond %{HTTP_HOST} ^yourdomain\.com$ [NC] RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [L,R=301] 全部統(tǒng)一到不帶www,例如將 www.geizy.cn 統(tǒng)一到 cnwenhui.cn RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.yourdomain\.com$ [NC] RewriteRule ^(.*)$ http://yourdomain.com/$1 [L,R=301] 防止別人的域名解析到自己的獨(dú)立IP RewriteEngine On RewriteCond %{HTTP_HOST} !(^www\.yourdomain\.com$) [NC] RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [L,R=301]
這個(gè)可以完成如下幾個(gè)功能:
如果你的網(wǎng)站綁定多個(gè)域名,為了只使用一個(gè)域名,就可以設(shè)置如上規(guī)則,例如網(wǎng)站綁定了 www.idcspy.com www.enmabiz.com 那么為了防止重復(fù)的url,就可以把上面的域名設(shè)置為www.idcspy.com,這樣來(lái)自www.enmabiz.com所有的訪問(wèn)都會(huì)重定向到 www.idcspy.com
如果你用的是獨(dú)立IP,那么別人就可以把它的域名解析到你的IP上,這個(gè)時(shí)候可以用這個(gè)規(guī)則,其他所有解析到你的IP上的域名都會(huì)轉(zhuǎn)向到你設(shè)置的域名上。
設(shè)置時(shí)區(qū)
在 Htaccess文件中加入 SetEnv TZ Asia/Chongqing 設(shè)置時(shí)區(qū),Asia/Chongqing 換成你要設(shè)置的時(shí)區(qū),Asia/Chongqing就表示北京時(shí)間。
自定義錯(cuò)誤頁(yè)面
下面是各種錯(cuò)誤頁(yè)面的定義方式,把 /cgi-bin/exxx.php 部分修改成你要使用的錯(cuò)誤頁(yè)面的路徑即可。