一、什么是URL重定向?
URL重定向(URL redirection,或稱網址重定向或網域名稱轉址),是指當使用者瀏覽某個網址時,將他導向到另一個網址的技術。
二、URL重定向怎么配置?
1)首先需要apache開啟重定向,修改httpd.conf配置:
1 查找: 2 Options FollowSymlinks 3 AllowOverride None 5 改為: 6 Options FollowSymlinks 7 AllowOverride All
2)去掉下面的注釋
LoadModule rewrite_module modules/mod_rewrite.so //去掉行前的#
3)重定向的配置在哪寫?
有兩種方式,第一種是在httpd.conf中寫,這種寫法適合有服務器完整權限的網站管理員,寫法大概如下:

4)我們這里主要介紹另外一種方式:在網站目錄中使用.htaccess,這種方法適合采用虛擬主機形式的網站管理員,
這兩種辦法設置的重定向規則其實基本上都是一樣的,只是設置的地方不同。
三、基本正則表達式
因為URL重定向語法中大量使用了正則表達式,并且正則是每隔一段時間不用都必然會淡忘的東西,所以我們有必要先回顧一下基本的正則寫法:
. 換行符以外的所有字符 \w 匹配字母或數字或下劃線或漢字 \s 匹配任意的空白符 \d 匹配數字 \b 匹配單詞的開始或結束 ^ 匹配字符串的開始 $ 匹配字符串的結束 * 重復零次或更多次 + 重復一次或更多次 ? 重復零次或一次 {n} 重復n次 {n,} 重復n次或更多次 {n,m} 重復n到m次 () $1 $2 一個括號代表一個分組,第一個括號里匹配的內容就用$1引用,第二個括號匹配的內容用$2引用,以此類推......
四、.htaccess都可以做什么?
.htaccess文件可以的事情,主要包括:文件夾密碼保護、用戶自定義重定向、自定義404頁面、擴展名偽靜態化、禁止特定IP地址的用戶、只允許特定IP地址的用戶、禁止目錄列表,等等。。
五、.htaccess語法規則
我們先看一個圖片防盜鏈的例子:
1 RewriteEngine On
2 Rewitebase /
3 RewriteCond %{HTTP_REFERER} !^http://(.+.)?baidu.com/ [NC] //如果來源網址不是*.baidu.com 3 RewriteCond %{HTTP_REFERER} !^$ //并且來源網址不是空 4 RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L] //如果訪問的文件后綴是jpeg,jpg,gif,bmp,png的圖片,則重定向到一個固定的圖片
然后我們下面根據這個例子依次展開說明:
第一行:
RewriteEngine On|Off //RewriteEngine 用于開啟或停用rewrite功能。
第二行:
Rewritebase URL-path
第三行:
RewriteCond TestString CondPattern [flags]
服務器變量NAME_OF_VARIABLE具體數值見下表:
HTTP_USER_AGENT //主要用于檢測訪問者系統和瀏覽器等 HTTP_REFERER //從哪個頁面鏈接過來 HTTP_cookie HTTP_FORWARDED HTTP_HOST //域名 HTTP_PROXY_ConNECTION HTTP_ACCEPT REMOTE_ADDR REMOTE_HOST REMOTE_USER REMOTE_IDENT REQUEST_METHOD script_FILENAME PATH_INFO QUERY_STRING AUTH_TYPE document_ROOT SERVER_ADMIN SERVER_NAME SERVER_ADDR SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE TIME_YEAR TIME_MON TIME_DAY TIME_HOUR TIME_MIN TIME_SEC TIME_WDAY TIME API_VERSION //這是正在使用的httpd中(服務器和模塊之間內部接口)的Apache模塊API的版本, 其定義位于include/ap_mmn.h中。此模塊版本對應于正在使用的Apache的版本 (比如,在Apache 1.3.14的發行版中,這個值是19990320:10)。 通常,對它感興趣的是模塊的作者。 THE_REQUEST //這是由瀏覽器發送給服務器的完整的HTTP請求行。(比如, “GET /index.html HTTP/1.1″). 它不包含任何瀏覽器發送的附加頭信息。 REQUEST_URI //這是在HTTP請求行中所請求的資源。 REQUEST_FILENAME //這是與請求相匹配的完整的本地文件系統的文件路徑名或描述. IS_SUBREQ //如果正在處理的請求是一個子請求,它包含字符串”true”,否則就是”false”。 模塊為了解析URI中的附加文件,有可能會產生子請求。
flags
RewriteRule flagRewriteRule標記 | 含 義 | 描 述 |
R | Redirect | 發出一個HTTP重定向 |
F | Forbidden | 禁止對URL地址的存取 |
G | Gone | 標記URL地址不存在 |
P | Proxy | 將URL地址傳遞給mod_proxy |
L | Last | 停止處理接下來的規則 |
N | Next | 再次重第一個規則開始處理,但是使用當前重寫后的URL地址 |
C | Chain | 將當前的規則和緊隨其后的規則鏈接起來 |
T | Type | 強制執行指明的MIME類 |
NS | Nosubreq | 只在沒有任何內部子請求執行時運行本腳本 |
NC | Nocase | URL地址匹配對大小寫不敏感 |
QSA | Qsappend | 在新的URL地址后附加查詢字符串部分,而不是替代 |
PT | Passthrough | 將重寫后的URL地址傳遞給另一個Apache模塊進行進一步處理 |
S | Skip | 忽略之后的規則 |
E | Env | 設置環境變量 |
rewritecond的其他用法:
“-d”(目錄)
將TestString視為一個路徑名并測試它是否為一個存在的目錄。
“-f”(常規文件)
將TestString視為一個路徑名并測試它是否為一個存在的常規文件。
“-s”(非空的常規文件)
將TestString視為一個路徑名并測試它是否為一個存在的、尺寸大于0的常規文件。
“-l”(符號連接)
將TestString視為一個路徑名并測試它是否為一個存在的符號連接。
“-x”(可執行)
將TestString視為一個路徑名并測試它是否為一個存在的、具有可執行權限的文件。該權限由操作系統檢測。
“-F”(對子請求存在的文件)
檢查TestString是否為一個有效的文件,而且可以在服務器當前的訪問控制配置下被訪問。它使用一個內部子請求來做檢查,由于會降低服務器的性能,所以請謹慎使用!
“-U”(對子請求存在的URL)
檢查TestString是否為一個有效的URL,而且可以在服務器當前的訪問控制配置下被訪問。它使用一個內部子請求來做檢查,由于會降低服務器的性能,所以請謹慎使用!
第四行:
RewriteRule Pattern Substitution [Flags]
五、更多使用舉例:
1、圖片重定向
RewriteEngine On RewriteCond %{HTTP_HOST} ^localhost$ //如果域名是localhost RewriteCond %{REQUEST_FILENAME} !-f //并且訪問的文件找不到 RewriteRule ^images/(.+) http://127.0.0.1/test/showimages/$1 [R=302,L] //則跳轉到另一個域名下的另一個目錄訪問這個圖片
2、二級域名重定向到www.yourdomain.com
rewriteEngine on
rewriteCond %{http_host} ^yourdomain.com [NC]
rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
3、網站升級時,臨時錯誤頁面
RewriteEngine on
RewriteCond %{REQUEST_URI} !/maintenance.html$ //如果請求的地址不是maintenance.html
RewriteCond %{REMOTE_ADDR} !^123.123.123.123 //客戶端ip如果不是這個
RewriteRule $ /error.html [R=302,L] //則重定向到error.html這個升級提醒頁面
4、重定向RSS地址到FeedSky
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} !FeedSky [NC]
RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feed.feedsky.com/yours
5、防止目錄瀏覽:
Options All -Indexes
6、404重定向
Errordocument 404 /404.html
7、設置目錄默認頁面
DirectoryIndex about.html
備注:.htaccess的權限要設置成644