apache_rewrie不再難,是人都看的懂
各位親apache rewrite 很實(shí)用哦^^,以下是人都看的懂的,不下你太不應(yīng)該了 1 首先看看有沒(méi)有加載首先確定您使用的Apache 版本,及是否加載了 mod_rewrite 模塊。及是否加載
各位親apache rewrite 很實(shí)用哦^^,以下是人都看的懂的,
不下你太不應(yīng)該了 1 首先看看有沒(méi)有加載
首先確定您使用的

Apache 版本,及是否加載了 mod_rewrite 模塊。及是否加載了 mod_rewrite 模塊 . mod_rewrite 的是一個(gè) Apache 模塊,可使服務(wù)器操縱請(qǐng)求的網(wǎng)址。根據(jù)一系列規(guī)則對(duì)傳入的網(wǎng)址進(jìn)行檢查,規(guī)則中包含一個(gè)正則表達(dá)式來(lái)檢測(cè)特定的格式。 如果在地址中發(fā)現(xiàn)了一個(gè)格式,并且滿(mǎn)足適當(dāng)?shù)臈l件,該格式就會(huì)被一個(gè)替代的字符串或者是動(dòng)作取代。
Apache 1.x 的用戶(hù)請(qǐng)檢查 conf/httpd.conf 中是否存在如下兩段代碼:
清單 1. Apache 1.x 的加載模塊代碼
LoadModule rewrite_module libexec/mod_rewrite.so
AddModule mod_rewrite.c
Apache 2.x 的用戶(hù)請(qǐng)檢查 conf/httpd.conf 中是否存在如下一段代碼: 清單 2. Apache 2.x 的加載模塊代碼
LoadModule rewrite_module modules/mod_rewrite.so
,如果存在,那么在配置文件(通常就是 conf/httpd.conf)中加入如下代碼。此時(shí)請(qǐng)務(wù)必注意,如果網(wǎng)站使用通過(guò)虛擬主機(jī)來(lái)定義,請(qǐng)務(wù)必加到虛擬主機(jī)配置,即
Apache 配置:
支持httpd.conf 配置和目錄 .htaccess配置
啟用rewrite
# LoadModule rewrite_module modules/mod_rewrite.so
去除前面的 #
LoadModule rewrite_module modules/mod_rewrite.so
啟用.htaccess
AllowOverride None 修改為: AllowOverride All
------------------------------------------------------------------------------
讓apache 服務(wù)器支持.htaccess
如何讓自己的本地APACHE 服務(wù)器支持”.htaccess”呢? 其實(shí)只要簡(jiǎn)單修改一下apache 的httpd.conf 設(shè)置就可以讓APACHE 支 持.htaccess 了。打開(kāi)httpd.conf 文件用文本編輯器打開(kāi)后, 查找
Options FollowSymLinks
AllowOverride None
改為
Options FollowSymLinks
AllowOverride All
就可以了。
RewriteEngine On
RewriteBase /
偽靜態(tài)
RewriteRule ^(article)-([0-9] ).htm$ $1.php?id=$2
根據(jù)IP 阻止用戶(hù)訪問(wèn)
order allow,deny
deny from 127.0.0.1
allow from all
Redirects 轉(zhuǎn)向
Redirect /article.php http://www.baidu.com
,防止.htaccess 文件被查看
order allow,deny
deny from all
制作錯(cuò)誤提醒頁(yè)面
ErrorDocument 404 http://www.baidu.com
添加 MIME 類(lèi)型
AddType application/x-shockwave-flash swf
Tips: 設(shè)置類(lèi)型為 application/octet-stream 將提示下載
改變?nèi)笔〉氖醉?yè)文件
DirectoryIndex aa.html index.html index.pl default.htm
防止目錄列表時(shí)顯示
IndexIgnore *
RewriteEngine On
RewriteBase /
RewriteCond {REQUEST_FILENAME} -s [OR]
RewriteCond {REQUEST_FILENAME} -l [OR]
RewriteCond {REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^([0-9a-zA-Z.] )$ demo.php?id=$1
mod_rewrite 規(guī)則修正符
1) R 強(qiáng)制外部重定向
2) F 禁用URL, 返回403HTTP 狀態(tài)碼。
3) G 強(qiáng)制URL 為GONE ,返回410HTTP 狀態(tài)碼。
4) P 強(qiáng)制使用代理轉(zhuǎn)發(fā)。
5) L 表明當(dāng)前規(guī)則是最后一條規(guī)則,停止分析以后規(guī)則的重寫(xiě)。
6) N 重新從第一條規(guī)則開(kāi)始運(yùn)行重寫(xiě)過(guò)程。
7) C 與下一條規(guī)則關(guān)聯(lián)
如果規(guī)則匹配則正常處理,以下修正符無(wú)效
8) T=MIME-type(force MIME type) 強(qiáng)制MIME 類(lèi)型
9) NS 只用于不是內(nèi)部子請(qǐng)求
,10) NC 不區(qū)分大小寫(xiě)
11) QSA 追加請(qǐng)求字符串
12) NE 不在輸出轉(zhuǎn)義特殊字符 =$1 等價(jià)于 =$1
RewriteEngine on
RewriteCond {HTTP_HOST} !^www.php100.com [NC]
RewriteRule ^(.*) http://www.php100.com/ [L]
RewriteEngine on
RewriteRule ^test([0-9]*).html$ test.php?id=$1
RewriteRule ^new([0-9]*)/$ new.php?id=$1 [R]
1、Rewrite 規(guī)則簡(jiǎn)介:
Rewirte 主要的功能就是實(shí)現(xiàn)URL 的跳轉(zhuǎn),它的正則表達(dá)式是基于Perl 語(yǔ)言??苫诜?wù)器級(jí)的(httpd.conf)和目錄級(jí)的 (.htaccess)兩種方式。如果要想用到rewrite 模塊,必須先安裝或加載rewrite 模塊。方法有兩種一種是編譯apache 的時(shí)候就直接 安裝rewrite 模塊,別一種是編譯apache 時(shí)以DSO 模式安裝apache, 然后再利用源碼和apxs 來(lái)安裝rewrite 模塊。
基于服務(wù)器級(jí)的(httpd.conf)有兩種方法,一種是在httpd.conf 的全局下直接利用RewriteEngine on來(lái)打開(kāi)rewrite 功能; 另一種是在局部里利用
RewriteEngine on來(lái)打開(kāi)rewrite 功能, 下面將會(huì)舉例說(shuō)明,需要注意的是, 必須在每個(gè)virtualhost 里用RewriteEngine on來(lái)打開(kāi)rewrite 功能。否則virtualhost 里沒(méi)有RewriteEngine on它里面的規(guī)則也不會(huì)生效。 基于目錄級(jí)的(.htaccess),要注意一點(diǎn)那就是必須打開(kāi)此目錄的
FollowSymLinks 屬性且在.htaccess 里要聲明RewriteEngine on。
2、舉例說(shuō)明:
下面是在一個(gè)虛擬主機(jī)里定義的規(guī)則。功能是把client 請(qǐng)求的主機(jī)前綴不是www.colorme.com 和203.81.23.202都跳轉(zhuǎn)到 主機(jī)前綴為
NameVirtualHost 192.168.100.8:80
ServerAdmin webmaster@colorme.com.cn
DocumentRoot "/web/webapp"
ServerName www.colorme.com.cn
ServerName colorme.com.cn
RewriteEngine on #打開(kāi)rewirte 功能
,RewriteCond {HTTP_HOST} !^www.colorme.com.cn [NC] #聲明Client 請(qǐng)求的主機(jī)中前綴不是www.colorme.com.cn,[NC]的意思是忽略大小寫(xiě)
RewriteCond {HTTP_HOST} !^203.81.23.202 [NC] #聲明Client 請(qǐng)求的主機(jī)中前綴不是203.81.23.202,[NC]的意思是忽略大小寫(xiě)
RewriteCond {HTTP_HOST} !^$ #聲明Client 請(qǐng)求的主機(jī)中前綴不為空,[NC]的意思是忽略大小寫(xiě)
RewriteRule ^/(.*) http://www.colorme.com.cn/ [L]
#含義是如果Client 請(qǐng)求的主機(jī)中的前綴符合上述條件,則直接進(jìn)行跳轉(zhuǎn)到http://www.colorme.com.cn/,[L]意味著立即停 止重寫(xiě)操作,并不再應(yīng)用其他重寫(xiě)規(guī)則。這里的.*是指匹配所有URL 中不包含換行字符,()括號(hào)的功能是把所有的字符做一個(gè)標(biāo)記,以便于后面的應(yīng)用. 就是 引用前面里的(.*)字符。
例二. 將輸入 folio.test.com 的域名時(shí)跳轉(zhuǎn)到profile.test.com
listen 8080
NameVirtualHost 10.122.89.106:8080
ServerAdmin webmaster@colorme.com.cn
DocumentRoot "/usr/local/www/apache22/data1/"
ServerName profile.test.com
RewriteEngine on
RewriteCond {HTTP_HOST} ^folio.test.com [NC]
RewriteRule ^/(.*) http://profile.test.com/ [L]
3.Apache mod_rewrite規(guī)則重寫(xiě)的標(biāo)志一覽
1) R[=code](force redirect) 強(qiáng)制外部重定向
強(qiáng)制在替代字符串加上http://thishost[:thisport]/前綴重定向到外部的URL. 如果code 不指定,將用缺省的302 HTTP狀態(tài)碼。
2) F(force URL to be forbidden)禁用URL, 返回403HTTP 狀態(tài)碼。
3) G(force URL to be gone) 強(qiáng)制URL 為GONE ,返回410HTTP 狀態(tài)碼。
4) P(force proxy) 強(qiáng)制使用代理轉(zhuǎn)發(fā)。
5) L(last rule) 表明當(dāng)前規(guī)則是最后一條規(guī)則,停止分析以后規(guī)則的重寫(xiě)。
6) N(next round) 重新從第一條規(guī)則開(kāi)始運(yùn)行重寫(xiě)過(guò)程。
7) C(chained with next rule) 與下一條規(guī)則關(guān)聯(lián)
如果規(guī)則匹配則正常處理,該標(biāo)志無(wú)效,如果不匹配,那么下面所有關(guān)聯(lián)的規(guī)則都跳過(guò)。
8) T=MIME-type(force MIME type) 強(qiáng)制MIME 類(lèi)型
9) NS (used only if no internal sub-request) 只用于不是內(nèi)部子請(qǐng)求
10) NC(no case) 不區(qū)分大小寫(xiě)
11) QSA(query string append) 追加請(qǐng)求字符串
12) NE(no URI escaping of output) 不在輸出轉(zhuǎn)義特殊字符
例如:RewriteRule /foo/(.*) /bar?arg=P1=$1 [R,NE] 將能正確的將
,/foo/zoo轉(zhuǎn)換成/bar?arg=P1=zed
13) PT(pass through to next handler) 傳遞給下一個(gè)處理
例如:
RewriteRule ^/abc(.*) /def$1 [PT] # 將會(huì)交給/def規(guī)則處理
Alias /def /ghi
14) S=num(skip next rule(s)) 跳過(guò)num 條規(guī)則
15) E=VAR:VAL(set environment variable) 設(shè)置環(huán)境變量
4.Apache rewrite例子集合
在 httpd 中將一個(gè)域名轉(zhuǎn)發(fā)到另一個(gè)域名虛擬主機(jī)世界近期更換了域名,新域名為 www.wbhw.com, 更加簡(jiǎn)短好記。這時(shí)需要將原來(lái)的域名
webhosting-world.com, 以及論壇所在地址 webhosting-world.com/forums/定向到新的域名,以便用戶(hù)可以找到,并且使原來(lái)的論壇 URL 繼續(xù)有效而不出現(xiàn) 404 未找到,比如原來(lái)的
在中添加下面的重定向規(guī)則:
RewriteEngine On
# Redirect webhosting-world.com/forums to bbs.wbhw.com
RewriteCond {REQUEST_URI} ^/forums/
RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L] # Redirect webhosting-world.com to wbhw.com
RewriteCond {REQUEST_URI} !^/forums/
RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]
添加了上面的規(guī)則以后, 里的全部?jī)?nèi)容如下:
ServerAlias webhosting-world.com
ServerAdmin admin@webhosting-world.com
DocumentRoot /path/to/webhosting-world/root
ServerName www.webhosting-world.com
RewriteEngine On
# Redirect webhosting-world.com/forums to bbs.wbhw.com
RewriteCond {REQUEST_URI} ^/forums/
RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L] # Redirect webhosting-world.com to wbhw.com
RewriteCond {REQUEST_URI} !^/forums/
RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]
URL 重定向
,例子一:
1.http://www.zzz.com/xxx.php-> http://www.zzz.com/xxx/
2.http://yyy.zzz.com-> http://www.zzz.com/user.php?username=yyy 的功能
RewriteEngine On
RewriteCond {HTTP_HOST} ^www.zzz.com
RewriteCond {REQUEST_URI} !^user.php$
RewriteCond {REQUEST_URI} .php$
RewriteRule (.*).php$ http://www.zzz.com/$1/ [R]
RewriteCond {HTTP_HOST} !^www.zzz.com
RewriteRule ^(. ) {HTTP_HOST} [C]
RewriteRule ^([^.] ).zzz.com
例子二:
/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]
5. 使用Apache 的URL Rewrite配置多用戶(hù)虛擬服務(wù)器
要實(shí)現(xiàn)這個(gè)功能,首先要在DNS 服務(wù)器上打開(kāi)域名的泛域名解析(自己做或者找域名服務(wù)商做)。比如,我就把 *.semcase.com和 *.semcase.cn全部解析到了我的這臺(tái)Linux Server上。
然后,看一下我的Apache 中關(guān)于*.semcase.com的虛擬主機(jī)的設(shè)定。 #*.com,*.osall.net
ServerAdmin webmaster@semcase.com
DocumentRoot /home/www/www.semcase.com
ServerName dns.semcase.com
ServerAlias dns.semcase.com semcase.com semcase.net *.semcase.com *.semcase.net
CustomLog /var/log/httpd/osa/access_log.log" common
ErrorLog /var/log/httpd/osa/error_log.log"
AllowOverride None
Order deny,allow
#AddDefaultCharset GB2312
,RewriteEngine on
RewriteCond {HTTP_HOST} ^[^.] .osall.(com|net)$ RewriteRule ^(. ) {HTTP_HOST}$1 [C]
RewriteRule ^([^.] ).osall.(com|net)(.*)$
/home/www/www.semcase.com/sylvan$3?un=$1&{QUERY_STRING} [L]
在這段設(shè)定中,我把*.semcase.net和*.semcase.com 的Document Root 都設(shè)定到了 /home/www/www.semcase.com
但是,繼續(xù)看下去,看到... 配置了嗎?在這里我就配置了URL Rewrite規(guī)則。 RewriteEngine on #打開(kāi)URL Rewrite功能
RewriteCond {HTTP_HOST} ^[^.] .osall.(com|net)$ #匹配條件,如果用戶(hù)輸入的URL 中主機(jī)名是類(lèi)似 xxxx.semcase.com 或者 xxxx.semcase.cn 就執(zhí)行下面一句
RewriteRule ^(. ) {HTTP_HOST}$1 [C] #把用戶(hù)輸入完整的地址(GET 方式的參數(shù)除外)作為參數(shù)傳給下一個(gè)規(guī)則,[C]是Chain 串聯(lián)下一個(gè)規(guī)則的意思 RewriteRule
^([^.] ).osall.(com|net)(.*)$ /home/www/dev.semcase.com/sylvan$3?un=$1&{QUERY_STRING} [L]
# 最關(guān)鍵的是這一句,使用證則表達(dá)式解析用戶(hù)輸入的URL 地址,把主機(jī)名中的用戶(hù)名信息作為名為un 的參數(shù)傳給/home/www /dev.semcase.com目錄下的腳本,并在后面跟上用戶(hù)輸入的GET 方式的傳入?yún)?shù)。并指明這是最后一條規(guī)則([L]規(guī)則)。注意,在這一句中 指明的重寫(xiě)后的地址用的是服務(wù)器上的絕對(duì)路徑,這是內(nèi)部跳轉(zhuǎn)。如果使用http://xxxx這樣的URL 格式,則被稱(chēng)為外部跳轉(zhuǎn)。使用外部跳轉(zhuǎn)的話,瀏 覽著的瀏覽器中的URL 地址會(huì)改變成新的地址,而使用內(nèi)部跳轉(zhuǎn)則瀏覽器中的地址不發(fā)生改變,看上去更像實(shí)際的二級(jí)域名虛擬服務(wù)器。 Apache 下禁止特定目錄PHP ,特定虛擬主機(jī)不支持PHP
有兩種方式:方式一:.htaccess 控制,適用于沒(méi)有服務(wù)器管理權(quán)限。在可寫(xiě)文件夾的目錄下,建一個(gè).htaccess 文件,內(nèi)容為:
Order allow,deny
Deny from all
方式二:修改Apache 配置文件,適用于有服務(wù)器管理權(quán)限。配置中增加如下內(nèi)容:
Order allow,deny
Deny from all
這樣只特定目錄不支持php ,其他不受影響