HTTP的規範中,狀態代碼301代表Permanent Redirect(永久定址轉移)、302則是暫時定址轉移,相較於使用HTML或是JavaScript來達到Redirect轉址目的,最大的差別在於301/302的HTTP狀態是被搜尋引擎所認可的;換句話說,你可以透過301/302轉址的方式讓搜尋引擎爬到你搬家後的新網頁。

至於301、302兩種狀態的差異,所謂的「永久」定址轉移是指搜尋引擎會根據你所指定的新網址重新建立索引,原來的位址便不再使用;而暫時定址轉移則是暫時性地將網頁搬到某個地方。

一般做301/302轉址可直接更改.htaccess檔案,讓Apache代勞即可:

Redirect 301 /not_available/old_page.html http://www.newserver.com/available/new_page.html

若要在Rails中來做這件事情,有幾種作法,最簡單的是在Controller裡面寫

headers["Status"] = "301 Moved Permanently"
redirect_to http://somenewurl/

或者

head :moved_permanently, :location => 'http://somenewurl'

或者,從Rails的原始碼中可以看到下列用法,感覺這個最好用:p

(from trunk/actionpack/lib/action_controller/base.rb)

# Examples:
#   redirect_to :action=>'atom', :status=>:moved_permanently
#   redirect_to post_url(@post), :status=>301
#   redirect_to :action=>'atom', :status=>302