.htaccess 重新導向/改寫 教學
章節 1 如何讓轉向所有到www.domain.com的連結,去domain.com?
問題描述:
你的網站可以透過www.domain.com和domain.com這兩個域名來存取。由於Google會處罰這樣子的網站只因為它們有重複的內容,你得讓你的域名要嘛是domain.com或是www.domain.com 。然而,由於所有從外界連進來的連結並不歸你管,而且搜尋引擎也已經對你的網站的兩個域名建立索引了,你很難輕易地改變這件事。
解法:
對於所有向錯誤URL要資料的http請求,做一個301轉址。
範例1 - 轉向所有不是www.domain.com 去www.domain.com
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [L,R=301]
範例2 - 轉向所有不是domain.com 去domain.com
RewriteEngine On
RewriteCond %{HTTP_HOST} !^domain\.com$ [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [L,R=301]
範例3 - 轉向所有domain.com 去www.domain.com
RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [L,R=301]
對於上述範例的解釋
讓我們先看範例1:
第一行指示apache啟動改寫模組
第二行RewriteCond %{HTTP_HOST} !www\.domain\.com$是比對指令。比對指令表示下一行的改寫指令只有當%{HTTP_HOST},即瀏覽器指向的域名,不是www.domain.com這個域名時,才會作用。其中!表示了「不是」的意思。[NC]表示忽略大小寫。^$這兩個符號中的文字,是正規表示式。所以.前面,必須加上逸脫字元。
第三行描述了改寫將如何改。其中^(.*)$這個正規表示式,比對了URL除了域名的後半部分。這條規則,表示將比對到的URL的後面部分,視為是$1,附加在domain.com/之後,作為新的URL。[L]表示這是最後一條改寫指令,所以一個http要求做了這次改寫之後,就會直接做為結果。而R=301是表示,網頁伺服器傳回一個301狀態碼給瀏覽器。
章節 2 如何將domain.com/重新導向成domain.com/index.php
問題描述:
你有個網站,域名是domain.com,而你打算讓所有進來的URL連結,凡是連到domain.com/的會跑到domain.com/index.php
解法:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain.com$
RewriteRule ^$ http://domain.com/index.php [L,R=301]
對於上述範例的解釋
第一行指示apache啟動改寫模組
第二行RewriteCond %{HTTP_HOST} ^domain\.com$是比對指令。比對指令表示下一行的改寫指令只有當%{HTTP_HOST},即瀏覽器指向的域名,等於domain.com這個域名時,才會作用。^$這兩個符號中的文字,是正規表示式。所以.前面,必須加上逸脫字元。
第三行描述了改寫將如何改。其中^$這個正規表示式,比對了URL除了域名的後半部分。這條規則,表示將比對到的URL的後面部分,在這個例子中,是空字串。而新的URL,將是http://domain.com/index.php。[L]表示這是最後一條改寫指令,所以一個http要求做了這次改寫之後,就會直接做為結果。而R=301是表示,網頁伺服器傳回一個301狀態碼給瀏覽器。
章節 3 如何透過.htaccess檔來移動域名下的資料
問題描述:
你有個網站,可以透過舊的域名olddomain.com來存取。而現在你有個新的域名,現在你希望這個網站可以透過newdomain.com來存取。然而,外界(整個網際網路)已經有有許多指向舊的域名的連結,你希望他們可以自動改連到新的域名。如此一來,舊域名的Google的搜尋排行也將可以由新域名來繼承。
解法:
對於每個到舊的域名要求資料的http要求,做301轉址
範例 - 從olddomain.com轉向到www.newdomain.com
RewriteEngine On
RewriteCond %{HTTP_HOST} !^newdomain.com$ [NC]
RewriteRule ^(.*)$ http://www.newdomain.com/$1 [L,R=301]
章節 4 加入結尾斜線到被要求的URL後方。
問題描述:
有時候,網址中的結尾斜線的表示的意思是資料夾,如果忘了加結尾斜線就會造成伺服器錯誤。舉個例子,如果http://domain.com/dir/對應到dir這個目錄。如果使用者打的網址是http://domain.com/dir時,因為忘了加結尾斜線,伺服器會以為要去找dir這個檔案,就會造成錯誤。
解法:
讓所有的沒有結尾斜線但是又是指向資料夾的URL,轉向成有結尾斜線的URL。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/ [R]
對於上述範例的解釋
第一行指示apache啟動改寫模組
第二行RewriteCond %{REQUEST_FILENAME} -d是比對指令。意思是,只有當目標的檔名是一個資料夾時,才讓下方的改寫規則作用。
第三行描述了改寫規則將如何改寫。其中^(.+[^/])$這個正規表示式,比對了URL除了域名的後半部分。這條規則,表示將比對到的URL的後面部分,是一個最後沒有加結尾斜線的字串。改寫時,原來的檔名最後將被加上結尾斜線,作為新的URL。而R表示,網頁伺服器傳回一個301狀態碼給瀏覽器。
更多範例,請參考Apache官方文件