2016-11-11 75 views
2

在使用Laravel,我真的很感激能夠使用:可以輕鬆模擬Laravel的返回Redirect :: back()的行爲?

return Redirect::back(); 

POST請求後返回到以前的URL。

中有沒有簡單的內置方式去執行

http.Redirect(w, r, backURL, http.StatusSeeOther) 

其中backURL是發出POST請求的URL。

我已經瀏覽了net/http並搜索了SE和谷歌,但我還沒有轉過頭。如果沒有一個簡單的方法,我會很感激任何指向這種做法的慣用方法轉到

回答

5

Redirect::back()函數使用由客戶端(瀏覽器)指定的Referer HTTP標頭中的URL。

你可以訪問此標頭值等r.Header.Get("Referer"),但http.Request類型還提供了直接的方法Request.Referer()返回此Referer字段,這也與它的2種可能的形式("Referer""Referrer")交易的值。

這是你可以模仿「回去」的行爲:

func PostHandler(w http.ResponseWriter, r *http.Request) { 
    // Process form, then: 
    if rf := r.Referer(); rf != "" { 
     http.Redirect(w, r, rf, http.StatusSeeOther) 
     return 
    } 

    // No Referer specified, supply your own response 
    // or redirect to a default/home page 
    http.Redirect(w, r, "/", http.StatusSeeOther) 
} 

如果你想從衆多處理器調用此,您可以在輔助函數捕獲此功能:

func redirectBack(w http.ResponseWriter, r *http.Request) { 
    if rf := r.Referer(); rf != "" { 
     http.Redirect(w, r, rf, http.StatusSeeOther) 
     return 
    } 

    // No Referer specified, supply your own response 
    // or redirect to a default/home page 
    http.Redirect(w, r, "/", http.StatusSeeOther) 
} 

然後使用它:

func PostHandler(w http.ResponseWriter, r *http.Request) { 
    // Process form, then: 
    redirectBack(w, r) 
} 
+1

真棒的答案。這也導致了我的'Request''Referer()'方法,它允許編譯器檢查Referer的錯誤拼寫。 –

+1

@PaulParker你說得對,使用['Request.Referer()'](https://golang.org/pkg/net/http/#Request.Referer)更好。我會編輯。 – icza

相關問題