如何透過.htaccess檔,來使用URL redirect/rewrite功能?

.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官方文件

此答案有用麼?

 打印

建議閱讀

ssh top出現的mysql線程,可以去砍掉嗎?

Q:我登入ssh 查看到的線程裡,有 mysql 在運作,可以去砍掉(kill)嗎?   A:不可以隨意去砍掉,建議先使用重開的語法 service mysql restart...

html 轉頁的語法

請將下列的代碼,擺到 index.html...

請問虛擬主機的log檔在哪呢?

Q: 請問虛擬主機的log檔在哪呢?A: access log 部份, 在ftp 的根目錄access_log 資料夾內。      error...

如何透過.htaccess檔來做限制密碼登入及IP白名單

123456789101112 AuthType Basic AuthName "Secure site" AuthUserFile...

虛擬主機,該如何修改php的參數?

問: 如果我是虛擬主機用戶,該如何修改php的參數?答: 請參考我們的blog 文章:...