使用.htaccess實現apache URL重定向


一、什么是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中寫,這種寫法適合有服務器完整權限的網站管理員,寫法大概如下:

<VirtualHost *:80>
    ServerAdmin yangjx009@139.com
    DocumentRoot "/websites/www"
    ServerName localhost
    RewriteEngine On
    RewriteRule ^index\.html$ index.php [L]
</VirtualHost>
httpd.conf配置url重定向

  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
/*
設定基准目錄,例如希望對根目錄下的文件rewrtie,就是”/”
RewriteBase用於設定重寫的基准URL。
在對一個新的URL進行替換時,此模塊必須把這個URL重新注入到服務器處理中。為此,它必須知道其對應的URL前綴或者說URL基准。
通常,此前綴就是 對應的文件路徑。但是,大多數網站URL不是直接對應於其物理文件路徑的,因而一般不能做這樣的假定! 所以在這種情況下,
就必須用RewriteBase指令來指定正確的URL前綴。 如果你的網站服務器URL不是與物理文件路徑直接對應的,而又需要使用RewriteBase指令,則必須在每個對應的.htaccess文件中指定 RewriteRule 。
*/

   第三行:

RewriteCond TestString CondPattern [flags]
/*
1、RewriteCond:
指令定義了一個規則的條件,即,在一個RewriteRule指令之前有一個或多個RewriteCond指令。 條件之后的重寫規則僅在當前URI與pattern匹配並且符合這些條件的時候才會起作用。 2、TestString:
是一個純文本的字符串,但是還可以包含下列可擴展的成分: 3、RewriteRule反向引用:
引用方法是 $N (0 <= N <= 9) 引用當前(帶有若干RewriteCond指令的)RewriteRule中的 與pattern匹配的分組成分(圓括號!)。 4、RewriteCond反向引用:
引用方法是 %N (1 <= N <= 9) 引用當前若干RewriteCond條件中最后符合的條件中的分組成分(圓括號!)。 5、RewriteMap 擴展:
 引用方法是 ${mapname:key|default} 6、服務器變量:
引用方法是 %{ NAME_OF_VARIABLE } 這個是我們最常使用到的功能
7、CondPattern:
是條件pattern, 即, 一個應用於當前實例TestString的正則表達式, 即, TestString將會被計算然后與CondPattern匹配.
可以在pattern串中使用!
字符(驚嘆號)來實現匹配的反轉。
8、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 flag
RewriteRule標記 含 義 描 述
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]
/*
其中的Pattern就是參數,一般為一些文件的擴展名;
Substitution是用來替換前面用的;
這兒的Flags,參考上面的表格,常用的R表示 redirect(強制重定向),F表示forbidden(禁止訪問),L表示last(最后),通常當你希望停止重寫操作而立即重定向時,可用它。
*/

五、更多使用舉例:

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

 

擴展閱讀:

http://blog.neazor.com/?p=559

http://www.cnblogs.com/ganiks/p/htaccess-get-started.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM