使用 .htaccess 實現 Redirect 301/302 重定向轉址規則


.htaccess 能夠幫助我們透過簡單的幾行程式碼,就能輕鬆的寫入 Redirect 規則,實現 301 或 302 的轉址,讓老舊的網址能夠自動跳轉至指定的新網址,不怕讓使用者看到錯誤畫面而造成使用者體驗不佳的情況了。

通常,除了透過 .htaccess 檔案建立規則來實現網址跳轉功能之外,我們也能透過 CloudFlare 的規則來建立 Forwarding URL,實現自動轉址。

透過 CloudFlare 的規則來建立 Forwarding URL,實現自動轉址。

可惜的是,免費帳戶只能提供3條免費的規則建立,因此若你有大量的舊網址需要遷移時,使用 .htaccess 的方式建立 Redirect 規則就是一個好的選擇。

因此,今天才介紹一些常見與常用的 .htaccess Redirect 規則,讓你能夠快速建立 Redirect 跳轉。

Htaccess 文件簡介

.htaccess 是一個標準的 Apache Web Server 的配置文件,用來控制目錄與所有的子目錄。一般常見基於 Linux 建立的網站,通常都會使用 Apache 進行託管,因此在系統環境安裝完成後,你可以看到預設就已經存在 .htaccess 的文件。

假如你是使用 WordPress、Joomla、Drupal…等等的 Content Management System(CMS),相信你對這個 .htaccess 檔案一定不陌生,因為在這些內容管理系統預設都是使用 .htaccess 來控制大部分的系統執行命令。

.htaccess 檔案可以寫入伺服器的特殊指令,用來指定網域與 IP 的對應,此外,.htaccess 文件常見的做法還有用來自動配置使用者重定向至指定的URL網址,甚至將整個網域進行重定向的跳轉。

簡單來說,.htaccess 能做到的事情非常多,而今天我們就針對 .htaccess 的一項好用功能「實現 Redirect 重定向」功能來做詳細的介紹。

.htaccess 常見的 301/302 重定向規則

如何重定向(301 Redirect)單個頁面?

Redirect 301 /new.php https://example.com/new.html

代表將 https://example.com/new.php 使用 301 轉址方式轉至 https://example.com/new.html

如何重定向(301 Redirect)整個網站/網域到另一個新的網站/網域?

Redirect 301 / https://newsite.com/




代表將目前網域/網站,整個透過 301 轉址方式跳轉至 https://newsite.com/,假設目前網域是 https://example.com/,那麼整個網域都會以 301 轉址方式轉至 https://newsite.com/。

如何重定向(301 Redirect)整個網站/網域到子目錄?

Redirect 301 / https://example.com/subfolder/

代表將目前網域/網站,透過 301 轉址方式,將網站轉移至 /subfolder/ 這個子目錄當中。

如何重定向(301 Redirect)子目錄到另一個新的網站?

Redirect 301 /subfolder https://newsite.com/

代表將舊的子目錄,透過 301 轉址方式,將該子目錄重定向至新的網址當中。

如何只重定向(301 Redirect)後綴檔案編碼,保留前面所有檔案名稱?

RedirectMatch 301 (.*).html$ https://example.com$1.php

舉例來說,當你的網站改變系統,原本網頁的編碼為:https://example.com/article-1.php,透過這個重定向規則之後,就會跳轉成:https://example.com/article-1.html

如何使用重寫規則從舊網域重定向(301 Redirect)至新網域?

RewriteEngine on
RewriteBase /
RewriteRule (.*) https://newsite.com/$1 [R=301,L]

如何使用重寫規則從 non-www 子網域重定向(301 Redirect)指定至 www 子網域?

RewriteEngine on
RewriteBase /
rewritecond %{http_host} ^example.com [nc] rewriterule ^(.*)$ https://example.com/$1 [r=301,nc]

如何使用重寫規則從 non-www 網域重定向(301 Redirect)至帶有子目錄的 www 網域?

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} example.com [NC] RewriteRule ^(.*)$ https://www.example.com/directory/index.html[R=301,NC]

如何使用重寫規則從舊網域重定向(Redirect)至整個新網域(包含完整路徑與所有 query 查詢字串參數)?

Options +FollowSymLinks
RewriteEngine On
RewriteRule ^(.*) https://www.newsite.com%{REQUEST_URI} [R=302,NC]

如何使用重寫規則從擁有子目錄的舊網域當中,重定向(Redirect)至沒有子目錄的新網域,且同時包括完整路徑和查詢參數字串?

Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_URI} ^/oldsubfolder/(.)$ RewriteRule ^(.) https://www.newsite.com/%1 [R=302,NC]

如何使用重寫規則將具有查詢參數字串的檔案重定向(Redirect)至根目錄(Root)當中?

RewriteEngine on
RewriteCond %{QUERY_STRING} id=10
RewriteRule ^index.php$ /new-path/? [L,R=301]

舉例來說,原本網址為:https://example.com/index.php?id=10,會重定向(Redirect)至新網址至:https://example.com/new-path/ 當中。




如何使用重定向(Redirect)將 https 網址強制 Force 指向至 http 網址?

RewriteEngine on
RewriteCond %{HTTPS} on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

雖然不知道為什麼你需要這麼做,但有時若為了排除一些設定上的錯誤,你必須要暫時將網站從 https 轉移至 http 時,就可以使用這個重定向規則。

如何使用重定向(Redirect)將 http 網址強制 Force 指向至 https 網址?

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

這個方式能夠強制將網站從 http 轉至 https,通常你的網站有duplicate content 重複內容的警告時,就可以使用這個 .htaccess 重定向規則。(但切記,你的網站一定必須先安裝並擁有 SSL 證書,否則會出現錯誤。

如何刪除後墜,例如 index.html 或是 index.php 並重定向(301 Redirect)至根目錄(Root)當中?

RewriteEngine On
RewriteCond %{THE_REQUEST} /index.php HTTP [NC] RewriteRule (.*)index.php$ /$1 [R=301,L]

RewriteEngine On
RewriteCond %{THE_REQUEST} /index.html HTTP [NC] RewriteRule (.*)index.html$ /$1 [R=301,L]

如何保留參數字串,並保留網址結構,將參數字串作為目錄名稱並重定向(Redirect)至根目錄(Root)當中?

RewriteEngine On
RewriteRule ^([^/d]+)/?$ index.php?id=$1 [QSA]

舉例來說,原本你的網址為:https://example.com/index.php?id=1024,使用這個重定向(Redirect)規則後,新網址就會變至:https://example.com/1024/

如何保留參數字串,並保留網址結構,將參數字串作為目錄名稱並重定向(Redirect)至子目錄(subdirectoryt)當中?

RewriteEngine On
RewriteRule ^/?category/([^/d]+)/?$ index.php?category=$1 [L,QSA]

如何將舊網站重定向(301 Redirect)至新網域,同時保留其他原始的URL路徑?

RewriteEngine on
RewriteCond %{HTTP_HOST} ^oldsite.com$ [NC] RewriteRule ^(.*)$ https://newsite.com/$1 [R=301,L]

如何將存於根目錄的部落格文章重定向(302 Redirect)至 /blog/ 子目錄當中?

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_URI}/ blog
RewriteRule ^(.https://blogsite.com/%{REQUEST_URI} [R=302,NC] RewriteRule ^(.) https://blogsite.com/blog/%{REQUEST_URI} [R=302,NC]

如何將一個目錄重定向(Redirect)至另一個目錄?

Options +FollowSymLinks RewriteEngine On RewriteRule ^(.)/old-directory/(.)$ $1/new-directory/$2 [R,L]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端