wordpress、nginx、Apache怎麼設定301轉址?

301轉址

本篇介紹如何在伺服器端設定301的轉址,請依主機所使用的「HTTP伺服器」選擇使用Apache方法;或是NGINX方法設置。

如果你是使用WordPress,不想動到程式、並且不介意安裝個小外掛,建議可以使用Simple 301 Redirects來處理即可,此篇下方有使用的教學:

究竟什麼是301轉址?告訴搜尋引擎你家的新地址!

設定.htaccess 301轉址-適用Apeach

在你的網站根目錄下找到.htaccess,如果沒有就自己新增一個,這個檔案將能寫一些程式碼來控制Apeach的行為,像是301轉址,你可以在.htaccess中寫入這樣:

同網域下之站內301轉址

EX:把oldfile.htm 轉址到 newfile.htm

Redirect 301 /oldfile.htm /newfile.htm

301轉到別的網域去

Redirect 301 /oldfile.htm http://example.net/newfile.htm

將舊網域301轉到新網域

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com [NC,OR]
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ http://example.net/$1 [L,R=301,NC]

在www以及沒www的版本中,選擇只恆用其中一個網址

每個網域基本上都帶有www以及沒有www的版本,並且都是連結到首頁,但在搜尋引擎眼裡,卻是兩個不同的網站。而為了要對SEO優化專心在同一個網域上,常常站長們會只選擇一個來做使用,另一個則當有人連線時就做301轉址到另一個去。

永遠使用有www的網址

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

永遠使用沒有www的網址

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

Apeach轉址可能遇到的錯誤

如果在加入程式碼後出現轉換錯誤的話,可能是Apeach在Rewrite下出現錯誤,請在RewriteEngine on上方再加入一行程式碼

Options +FollowSymLinks

舉一個為例,固定使用www的轉址將會變為:

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301,NC]

 

實際使用時,記得將案例中的example.com換作是自己的網域噢!

.htaccess還可以控制許多Apeache,但很多程式實在很難熟記,這邊推薦一個網站只要你填入你想做的行為——像是301轉址、甚至阻擋某IP進入網站,會自動幫你生成.htaccess的程式碼:

.htaccess線上程式生成器

 

設定nginx.conf來做301轉址 – 適用Nginx

舊網址301到新網址

第一步是打開nginx.conf檔案,有些分比較細的主機,關於你網站的網址conf檔不會寫在主nginx.conf裡,而是寫在以你網域為名的conf檔中。
EX: make9.tw.conf,修改以下部分:

server
{
listen 80;
server_name www.make9-new.tw www.make9-old.tw;
if ($host ~* www.make9-old.tw){
rewrite ^/(.*)$ http://www.make9-new.tw/$1 permanent;
}
index index.html index.htm index.php
}

上述例子是你從舊網址改為新網址的方式,也同樣適用於有www的網址和沒www的網址你只想永遠用其中一個,那就將另一個301永遠轉址到另一個即可。

舊網址301到新網址(方法二)

server {
listen 80;
listen [::]:80;
server_name make9-old.tw make9-old.tw;
rewrite ^ $scheme://make9-new.tw$request_uri? permanent;
}
方法二中,listen 的部分要看你是要修改一般 http 進來的就是設定 80,假如是修改 https 進來的流量則是要監聽 443.

return 301轉址方法

剛剛上面的方法適合針對同個網站中,網址的變動,如果是整個網站搬家則可以使用return語法來做301轉址,會比較直覺:

return 301 https://make9.tw$request_uri;
同樣是放在nginx的server之中使用,意思是所有進來的流量都301轉址到這個新網址去,而後面的$字號變數則是假如進來的網址有帶參數,也會一併保留轉過去,確保訪問舊網站內頁的使用者,也都能直接訪問新網站的內頁。

WWW和沒有WWW擇一網址使用

server
{
listen 80;
server_name www.make9.tw make9.tw;
if ($host ~* www.make9.tw){
rewrite ^/(.*)$ http://make9.tw/$1 permanent;
}
index index.html index.htm index.php
}

此例是把所有www.make9.tw轉到make9.tw,就如同現在你所瀏覽的的make9.tw主站一樣(可以試著輸入有www的版本試試實際效果!),將範例中的make9改為你的網址就可以套用在自己的網站上嘍!

將 http 強制轉為 https

server {
listen 80;
listen [::]:80;
server_name make9.tw www.make9.tw;
rewrite ^ https://make9.tw$request_uri? permanent;
}

這方法也適用一些其他應用,像是多個網址要連入同一個網站,但只想要用其中一個網址當代表

 

302轉址

302轉址並非此次討論範圍,但這邊需要注意的是,如果:

rewrite ^/(.*)$ http://www.make9-new.tw/$1 permanent;

改成

rewrite ^/(.*)$ http://www.make9-new.tw/$1 redirect;

將permanent改為redirect的話一樣會有同樣的轉址效果,訪客不會感覺到任何差異,但在SEO上的意義則會變為「302轉址」,而非「301轉址」。兩個的差別在於301為「永久轉址」,302則為「暫時轉址」,這部份別搞混了!

適用於修改階層的301轉址方法

上面的方法是只適用在你Host的網址(基本上就是主網址),假如你想修改的是網址的結構階層呢?那就需要如下這樣寫:

server
{
listen 80;
server_name www.make9.tw make9.tw
rewrite ^/about/year/(.*)$ https://make9.tw/year/$1 permanent;
index index.html index.htm index.php
}

請注意rewrite開頭的那行程式,假如連入的網址為:

http://www.make9.tw/about/year/2018

將會301轉址為:

http://www.make9.tw/year/2018

將about階層給去掉了,稍微理解對照一下rewrite那行程式,將網址改為自己的網址,你就可以變化出你想要的轉址方式。

最後修改完成記得重啟你的nginx:

service nginx restart

這樣就完成了。

在這裡,你不會被廣告打擾,所有的學習內容都是免費的。
如果這讓你感到滿意,一杯咖啡能讓我們走得更遠。

請 Perry 喝杯咖啡
上一篇本機端Wordpress,Mac的FTP及權限問題解決[2019更新] 下一篇WordPress優化神器!必裝的最強快取組合!

Divi 編輯器特賣 onSale!

Divi Summer Sale 20% 折扣!時間有限!

90秒強大功能展示:傳送門

優惠傳送門:傳送門

Divi 中文化:傳送門

完整教學:傳送門

Divi 特賣 onSale!