关于Apache mod_rewrite的中文配置、使用和语法介绍(实现URL重写和防盗链功能)
介紹和配置:
以數(shù)據(jù)庫(kù)后臺(tái)驅(qū)動(dòng)的動(dòng)態(tài)內(nèi)容的網(wǎng)站,經(jīng)常會(huì)遇到這些的問(wèn)題:
- 當(dāng)在瀏覽器的地址欄輸入一個(gè)無(wú)效的參數(shù)時(shí),會(huì)出現(xiàn)數(shù)據(jù)庫(kù)的錯(cuò)誤提示,這是一個(gè)安全的隱患
- 搜索引擎無(wú)法收錄你的所有網(wǎng)頁(yè)
- 網(wǎng)頁(yè)的鏈接地址是一系列的參數(shù),對(duì)瀏覽用戶和搜索引擎都不易理解
這些問(wèn)題都可以通過(guò)Apache服務(wù)器的一個(gè)基本的模塊mod_rewrite來(lái)解決,默認(rèn)的安裝的Apache就會(huì)裝有這個(gè)模塊。要啟用這個(gè)模塊,打開 httpd.conf文件,察看下面的兩行是否被屏蔽,第一行是載入mod_rewrite模塊,第二行是啟用這個(gè)模塊。
LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.cmod_rewrite這個(gè)模塊是如何工作的呢?
mod_rewrite截獲符合特定條件的URL,并按照設(shè)定的規(guī)則將它們改寫成需要的URL。
比如,可以將 http://www.mysite.com/product.php?pid=123312 這樣的URL改寫成
http://www.mysite.com/product-123312.html 這樣的靜態(tài)URL,或者是更具體的 http://www.mysite.com/product/thinkpad-t42.html
重寫的規(guī)則重寫的規(guī)則的表達(dá)式:
RewriteRule 模式 替換 [選項(xiàng)]
RewriteRule 是一個(gè)簡(jiǎn)單的命令告訴mod_rewrite這個(gè)模塊如何去重寫,關(guān)鍵的地方在于可以在模式和替換中使用正則表達(dá)式來(lái)匹配相應(yīng)的字符,正則表達(dá)式的廣泛的靈活性能將動(dòng)態(tài)的URL轉(zhuǎn)換成各式各樣的符合要求的靜態(tài)URL。看看這個(gè)重寫規(guī)則:
RewriteRule /products/([0-9]+)
/fancy/products.php?id=$1當(dāng)你在瀏覽器地址欄輸入 http://www.mysite.com/product/123 時(shí),這個(gè)地址被重寫為 http://www.mysite.com/fancy/product.php?id=123
這樣,訪問(wèn)者就無(wú)法知道你的程序真正放在那個(gè)目錄,程序的真正名字是什么,這也提高了網(wǎng)站的安全系數(shù);這樣的URL也去掉了?=這些字符,易于搜索引擎的機(jī)器人爬行你的網(wǎng)站。
通過(guò)正則表達(dá)式,可以寫出更復(fù)雜的重寫規(guī)則:
RewriteRule ^/products$ /content.php
RewriteRule ^/products/([0-9]+)$ /content.php?id=$1
RewriteRule ^/products/([0-9]+),([ad]*),([0-9]{0,3}),([0-9]*),([0-9]*$)重寫規(guī)則的選項(xiàng)有
- ‘forbidden’ 或 ‘f’ - 403 禁止
- ‘gone’ 或 ‘g’ - 410 gone
- ‘nocase’ 或 ‘NC’ - 大小寫敏感
- ‘next’/N’ - 回到第一條規(guī)則
- ’skip=N’ 或 ‘S=N’ - 跳過(guò)下面的N條規(guī)則
流程控制
mod_rewrite是按照從上到下的順序執(zhí)行重寫的規(guī)則,如果URL匹配了第一條規(guī)則,則按照第一條規(guī)則進(jìn)行重寫,如果不匹配,就執(zhí)行第二條規(guī)則,直到最后。通過(guò)流程控制,可以定義在不同情況下采用不同的重寫規(guī)則。格式是:
RewriteCond 測(cè)試條件 Condition
這些測(cè)試條件有:
- HTTP變量: HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_FORWARDED, HTTP_HOST, HTTP_PROXY_CONNECTION, HTTP_ACCEPT
- 連結(jié)和請(qǐng)求的變量: REMOTE_ADDR, REMOTE_HOST, REMOTE_USER, REMOTE_IDENT, REQUEST_METHOD, SCRIPT_FILENAME, PATH_INFO, QUERY_STRING, AUTH_TYPE
- 服務(wù)器內(nèi)部變量: DOCUMENT_ROOT, SERVER_ADMIN, SERVER_NAME, SERVER_ADDR, SERVER_PORT, SERVER_PROTOCOL, SERVER_SOFTWARE
- 系統(tǒng)變量: TIME_YEAR, TIME_MON, TIME_DAY, TIME_HOUR, TIME_MIN, TIME_SEC, TIME_WDAY, TIME
- mod_rewrite特殊值: API_VERSION, THE_REQUEST, REQUEST_URI,
例如,利用mod_rewrite可以禁止從其他的網(wǎng)站鏈接到你的圖片:
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://localhost/.*$ [OR,NC]
RewriteCond %{HTTP_REFERER} !^http://mysite.com/.*$ [OR,NC]
RewriteCond %{HTTP_REFERER} !^http://www.mysite.com/.*$ [OR,NC]
RewriteRule .*\.(gif|GIF|jpg|JPG)$ http://mysite/images/bad.gif [L,R]
配置apache mod_rewrite最簡(jiǎn)單的方法:
在網(wǎng)上找了很多篇關(guān)于配置apache mod_rewrite的文章,發(fā)覺(jué)這篇最有用,大家需要的可參考一下。
1,通過(guò)php提供的phpinfo()函數(shù)查看環(huán)境配置,通過(guò)Ctrl+F查找到“Loaded Modules”,其中列出了所有apache2handler已經(jīng)開啟的模塊,如果里面包括“mod_rewrite”,則已經(jīng)支持,不再需要繼續(xù)設(shè)置。
如果沒(méi)有開啟“mod_rewrite”,則打開目錄 您的apache安裝目錄“/apache/conf/” 下的 httpd.conf 文件,通過(guò)Ctrl+F查找到“LoadModule rewrite_module”,將前面的”#”號(hào)刪除即可。如果沒(méi)有查找到,則到“LoadModule” 區(qū)域,在最后一行加入“LoadModule rewrite_module modules/mod_rewrite.so”(必選獨(dú)占一行),然后重啟apache服務(wù)器即可。
2, 讓apache服務(wù)器支持”.htaccess”
如何讓自己的本地APACHE服務(wù)器支持”.htaccess”呢?其實(shí)只要簡(jiǎn)單修改一下apache的httpd.conf設(shè)置就可以讓APACHE支 持.htaccess了。打開httpd.conf文件(在那里? APACHE目錄的CONF目錄里面),用文本編輯器打開后,查找
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
改為
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
就可以了
3,建立 “.htaccess” 文件
如果是在windows平臺(tái)下,剛開始還真不知道怎么建立”.htaccess”文件,因?yàn)檫@個(gè)文件實(shí)際上沒(méi)有文件名,僅僅只有擴(kuò)展名,通過(guò)普通方式是無(wú)法建立這個(gè)文件的,別著急,馬上告訴你三種方法:
三種方法都是先建立一個(gè)htaccess.txt的文本文件(當(dāng)然,這個(gè)文本文件的名字你可以隨便取),然后有三種方式給這個(gè)文件重命名:(1)用記事本 打開,點(diǎn)擊文件–另存為,在文件名窗口輸入”.htaccess”,注意是整個(gè)綠色部分,也就是包含英文引號(hào),然后點(diǎn)擊保存就行了。(2)進(jìn)入cmd命令 窗口,通過(guò)cd切換當(dāng)剛建立htaccess.txt文件的文件夾,然后輸入命令:rename htaccess.txt .htaccess ,然后點(diǎn)擊鍵盤Enter鍵即可。(3)通過(guò)ftp連接htaccess.txt所在文件夾,通過(guò)ftp軟件重命名。
那么我們須要建立幾個(gè)“.htaccess” 文件,里面又輸入什么內(nèi)容呢?基本的原則是這樣,根目錄必須有一個(gè),用于重定向(URl重寫)所有的請(qǐng)求都會(huì)轉(zhuǎn)到到index.php(交給前端控制 器);”./application”文件夾下須要一個(gè),用于拒絕所有針對(duì)該文件夾內(nèi)容的直接訪問(wèn)(比如 http://localhost/application/models/User.php),這樣做是因?yàn)樗性L問(wèn)請(qǐng)求必選通過(guò)前端控制器來(lái)分配訪 問(wèn),其次為了安全;“./library”文件夾下的“.htaccess”同前;”./public”文件夾下必選建一個(gè),因?yàn)檫@個(gè)文件夾的文件全部是 供前端直接訪問(wèn)的,因此須要撤銷URl重寫。以下是4個(gè)“./htaccess”文件的內(nèi)容:
./.htaccess
RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
./application/.htaccess
deny from all
./library/.htaccess
deny from all
./public
RewriteEngine off
實(shí)際上,apache的url重寫功能也可以直接在httpd.conf文件中進(jìn)行設(shè)置,這里就不具體講了,網(wǎng)上相關(guān)的教程也很多。
Apache的RewriteRule規(guī)則詳細(xì)介紹:
R[=code](force redirect) 強(qiáng)制外部重定向
強(qiáng)制在替代字符串加上http://thishost[:thisport]/前綴重定向到外部的URL.如果code不指定,將用缺省的302 HTTP狀態(tài)碼。
F(force URL to be forbidden)禁用URL,返回403HTTP狀態(tài)碼。
G(force URL to be gone) 強(qiáng)制URL為GONE,返回410HTTP狀態(tài)碼。
P(force proxy) 強(qiáng)制使用代理轉(zhuǎn)發(fā)。
L(last rule) 表明當(dāng)前規(guī)則是最后一條規(guī)則,停止分析以后規(guī)則的重寫。
N(next round) 重新從第一條規(guī)則開始運(yùn)行重寫過(guò)程。
C(chained with next rule) 與下一條規(guī)則關(guān)聯(lián)
如果規(guī)則匹配則正常處理,該標(biāo)志無(wú)效,如果不匹配,那么下面所有關(guān)聯(lián)的規(guī)則都跳過(guò)。
T=MIME-type(force MIME type) 強(qiáng)制MIME類型
NS (used only if no internal sub-request) 只用于不是內(nèi)部子請(qǐng)求
NC(no case) 不區(qū)分大小寫
QSA(query string append) 追加請(qǐng)求字符串
NE(no URI escaping of output) 不在輸出轉(zhuǎn)義特殊字符
例如:RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 將能正確的將/foo/zoo轉(zhuǎn)換成/bar?arg=P1=zed
PT(pass through to next handler) 傳遞給下一個(gè)處理
例如:
RewriteRule ^/abc(.*) /def$1 [PT] # 將會(huì)交給/def規(guī)則處理
Alias /def /ghi
S=num(skip next rule(s)) 跳過(guò)num條規(guī)則
E=VAR:VAL(set environment variable) 設(shè)置環(huán)境變量
rewrite時(shí)服務(wù)器變量:
HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT
connection & request: REMOTE_ADDR, QUERY_STRING
server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL
system stuff: TIME_YEAR, TIME_MON, TIME_DAY
Rewrite規(guī)則表達(dá)式的說(shuō)明:
. 匹配任何單字符
[chars] 匹配字符串:chars
[^chars] 不匹配字符串:chars
text1|text2 可選擇的字符串:text1或text2
? 匹配0到1個(gè)字符
* 匹配0到多個(gè)字符
+ 匹配1到多個(gè)字符
^ 字符串開始標(biāo)志
$ 字符串結(jié)束標(biāo)志
\n 轉(zhuǎn)義符標(biāo)志
反向引用 $N 用于 RewriteRule 中匹配的變量調(diào)用(0 <= N <= 9)
反向引用 %N 用于 RewriteCond 中最后一個(gè)匹配的變量調(diào)用(1 <= N <= 9)
RewriteCond標(biāo)志符
'nocase|NC'(no case)忽略大小
'ornext|OR' (or next condition)邏輯或,可以同時(shí)匹配多個(gè)RewriteCond條件
RewriteRule適用的標(biāo)志符
'redirect|R [=code]' (force redirect)強(qiáng)迫重寫為基于http開頭的外部轉(zhuǎn)向(注意URL的變化) 如:[R=301,L]
'forbidden|F' (force URL to be forbidden)重寫為禁止訪問(wèn)
'proxy|P' (force proxy)重寫為通過(guò)代理訪問(wèn)的http路徑
'last|L' (last rule)最后的重寫規(guī)則標(biāo)志,如果匹配,不再執(zhí)行以后的規(guī)則
'next|N' (next round)循環(huán)同一個(gè)規(guī)則,直到不能滿足匹配
'chain|C' (chained with next rule)如果匹配該規(guī)則,則繼續(xù)下面的有Chain標(biāo)志的規(guī)則。
'type|T=MIME-type' (force MIME type)指定MIME類型
'nosubreq|NS' (used only if no internal sub-request)如果是內(nèi)部子請(qǐng)求則跳過(guò)
'nocase|NC' (no case)忽略大小
'qsappend|QSA' (query string append)附加查詢字符串
'noescape|NE' (no URI escaping of output)禁止URL中的字符自動(dòng)轉(zhuǎn)義成%[0-9]+的形式。
'passthrough|PT' (pass through to next handler)將重寫結(jié)果運(yùn)用于mod_alias
'skip|S=num' (skip next rule(s))跳過(guò)下面幾個(gè)規(guī)則
'env|E=VAR:VAL' (set environment variable)添加環(huán)境變量
實(shí)際操作
例子:
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]
RewriteRule ^.* - [F,L] 這里”-”表示沒(méi)有替換,瀏覽器為IE和Opera的訪客將被禁止訪問(wèn)。
例子:
RewriteEngine On
RewriteBase /test
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ([^/]+)$ /test/$1.php
#for example: /test/admin => /test/admin.php
RewriteRule ([^/]+)\.html$ /test/$1.php [L]
#for example: /test/admin.html => /test/admin.php
限制目錄只能顯示圖片
< IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !^.*\.(gif|jpg|jpeg|png|swf)$
RewriteRule .*$ - [F,L]
< /IfModule>
總結(jié)
以上是生活随笔為你收集整理的关于Apache mod_rewrite的中文配置、使用和语法介绍(实现URL重写和防盗链功能)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 开启Apache mod_rewrite
- 下一篇: you don't have permi