首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET Request.UrlReferrer 完整解析:取得上一頁網址、回傳導向與三大陷阱

     編輯:ASP.NET 基礎

基本用法

Request.UrlReferrer 回傳 Uri 物件,包含來源頁面完整 URL(Scheme、Host、Path、Query)。常用於「返回上一頁」、「防盜連」、「記錄流量來源」。

標準實作模式:儲存於 ViewState 供 Postback 後使用

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        if (Request.UrlReferrer != null)
            ViewState["ReturnUrl"] = Request.UrlReferrer.ToString();
    }
}

protected void btnBack_Click(object sender, EventArgs e)
{
    if (ViewState["ReturnUrl"] != null)
        Response.Redirect(ViewState["ReturnUrl"].ToString());
}

為什麼要在 !IsPostback 且判斷 != null?

  1. Postback 會改變 Referrer:表單送出後,瀏覽器將 Referrer 設為當前頁 URL,若不在首次載入時保存,會導致「返回」跳回自己。
  2. 直接輸入網址/書籤/新分頁:無 Referrer,屬性為 null,直接 .ToString() 會拋 NullReferenceException。

三大實務陷阱(必讀)

情境表現原因與對策
上一頁用 location.href 或 location.replace() 導向Referrer 為 null 或空字串JS 導向不發送 Referer 標頭。對策:改用 <a href="..."> 或表單 action 提交;或在 URL 帶入 ?returnUrl=... 參數。
A 頁 Page_Load 中 Response.Redirect("B.aspx")B 頁 Referrer 為 null伺服器端 Redirect 發生在瀏覽器尚未渲染 A 頁之前,無 Referer。對策:改用 Server.Transfer(同站內)或 A 頁輸出 <meta http-equiv="refresh"> / JS 延遲導向。
使用者按 F5 重新整理Referrer **不變**(仍為上一頁)重新整理保留原 Referer。若邏輯依賴「是否為重新整理」,請改用 IsPostBack 或 Token 機制判斷。

進階:跨域/HTTPS → HTTP Referrer 遺失

  • 瀏覽器安全策略:HTTPS 頁面連往 HTTP 資源,**不送 Referer**。
  • <meta name="referrer" content="no-referrer|origin|unsafe-url"> 可控制送出策略。
  • 若需可靠追蹤來源,**建議自行在連結帶參數**:<a href="B.aspx?src=HomePage">,後端讀 Request.QueryString["src"] 最穩定。

防盜連應用範例(.ashx 輸出圖片)

public class ImageGuard : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        string referrerHost = context.Request.UrlReferrer?.Host;
        string localHost = context.Request.Url.Host;

        if (string.IsNullOrEmpty(referrerHost) || !referrerHost.Equals(localHost, StringComparison.OrdinalIgnoreCase))
        {
            // 非本站嵌入 → 回傳預設圖或 403
            context.Response.StatusCode = 403;
            context.Response.WriteFile("~/Images/hotlink-denied.jpg");
            return;
        }

        // 合法請求 → 輸出真實圖片
        context.Response.ContentType = "image/jpeg";
        context.Response.WriteFile("~/Images/secret.jpg");
    }
    public bool IsReusable => false;
}

總結

  • Request.UrlReferrer 方便但**不可完全信任**(用戶端可偽造、瀏覽器/防火牆/Proxy 可能過濾)。
  • 關鍵業務(返回導向、防盜連、統計)**務必搭配 QueryString Token 或 Session 狀態**雙重保障。
  • 記得 !IsPostBack 時存入 ViewState,避免 Postback 覆蓋。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved