รับ HTTP Referrer ใน ASP.NET


103

ฉันกำลังมองหาวิธีที่รวดเร็วง่ายและเชื่อถือได้ในการรับHTTP Referrerของเบราว์เซอร์ในASP.Net ( C # ) ฉันรู้ว่าตัวอ้างอิง HTTP นั้นไม่น่าเชื่อถือ แต่ฉันต้องการวิธีที่เชื่อถือได้ในการรับผู้อ้างอิงหากมีอยู่



คำตอบ:


166

คุณสามารถใช้คุณสมบัติUrlReferrerของคำขอปัจจุบัน:

Request.UrlReferrer

สิ่งนี้จะอ่านส่วนหัวReferer HTTP จากคำร้องขอซึ่งไคลเอ็นต์อาจให้หรือไม่ก็ได้ (ตัวแทนผู้ใช้)


8
ควรสังเกตว่าคุณสมบัตินี้จะโยน System.UriFormatException ถ้าส่วนหัว HTTP อ้างอิงผิดรูปแบบ
NightOwl888

1
@Darin Dimitrov กำลังพยายามสร้าง REST API โดยใช้ WEB API UrlReferrer ไม่ได้เป็นส่วนหนึ่งของอ็อบเจ็กต์ Request ฉันควรเพิ่มคำว่า "ใช้" ฯลฯ ฉันหายไปไหน? DLL?
ราวี

1
ควรสังเกตว่าความแตกต่างคือการสะกดถูกต้อง ส่วนหัว http สะกดผิด MS ใช้การสะกดที่ถูกต้องในชื่อคุณสมบัติ น่าเสียดายที่ทั้งสองไม่ตรงกันซึ่งอาจทำให้บางคน (ฉัน) สับสนเมื่อทำการทดสอบ
ยอห์น

8
โปรดใช้ความระมัดระวังหากคุณใช้Request.UrlReferrerหลังการโพสต์แบ็คฝั่งเซิร์ฟเวอร์ แน่นอนว่าRequest.UrlReferrerตอนนี้จะมีมูลค่าของเพจที่คุณโพสต์กลับไป ในกรณีส่วนใหญ่ผู้คนต้องการหน้าก่อนหน้านี้ ในกรณีนี้ตรวจสอบให้แน่ใจว่าคุณจัดเก็บหน้าก่อนหน้านี้ในลักษณะบอกว่าตัวแปรวิวสเตทเมื่อโหลดหน้าครั้งแรก จากนั้นเมื่อคุณเข้าถึงตัวแปรนี้จะมีหน้าที่คุณมาจากก่อนหน้านี้ ตัวอย่างเช่นในเหตุการณ์การโหลดหน้าเว็บของ asp.net คุณสามารถทำได้:if (Request.UrlReferrer != null) ViewState["PreviousPageUrl"] = Request.UrlReferrer.ToString();
จอนห์

4
... และเมื่อคุณโพสต์กลับเช่นคุณสามารถทำได้:Response.Redirect(ViewState["PreviousPageUrl"] != null ? ViewState["PreviousPageUrl"].ToString() : "SomeOtherPage.aspx");
จอนห์

20

ใช้Request.UrlReferrerทรัพย์สิน.

ใต้ฉากเป็นเพียงการตรวจสอบServerVariables("HTTP_REFERER")ทรัพย์สิน


2
ดังนั้นจะไม่แตกต่างกันถ้าฉันใช้: HttpContext.Current.Request.ServerVariables ["HTTP_REFERER"]?
Chuck Le Butt

2
ในทางทฤษฎีไม่มีความแตกต่างในทางปฏิบัติฉันไม่สามารถพูดได้อย่างแน่นอนเนื่องจากการดูอย่างรวดเร็วด้วยตัวสะท้อนแสงแสดงให้เห็นว่าUrlReferrerทำได้มากกว่าการเรียกง่ายๆServerVariables("HTTP_REFERER")
Diadistis

13
ผมสามารถบอกคุณได้ว่าServerVariables["HTTP_REFERER"]ผลตอบแทนสตริงในขณะที่Request.UrlReferrerผลตอบแทนUri
Chuck Le Butt

19
Request.Headers["Referer"]

คำอธิบาย

Request.UrlRefererทรัพย์สินจะโยนSystem.UriFormatExceptionถ้าอ้างอิง HTTP ส่วนหัวอยู่ในรูปแบบ (ซึ่งสามารถเกิดขึ้นได้เพราะมันไม่ปกติภายใต้การควบคุมของคุณ)

สำหรับการใช้Request.ServerVariablesงานตาม MSDN:

Request.ServerVariables Collection

คอลเล็กชัน ServerVariables จะดึงค่าของตัวแปรสภาพแวดล้อมที่กำหนดไว้ล่วงหน้าและขอข้อมูลส่วนหัว

คำขอทรัพย์สินส่วนหัว

รับคอลเลกชันของส่วนหัว HTTP

Request.Headersเป็นตัวเลือกที่ดีกว่าRequest.ServerVariablesเนื่องจากRequest.ServerVariablesมีตัวแปรสภาพแวดล้อมทั้งหมดเช่นเดียวกับส่วนหัวโดยที่Request.Headersรายการที่สั้นกว่ามากซึ่งมีเฉพาะส่วนหัว

ดังนั้นทางออกที่ดีที่สุดคือใช้Request.Headersคอลเลกชันเพื่ออ่านค่าโดยตรง ปฏิบัติตามคำเตือนของ Microsoft เกี่ยวกับการเข้ารหัส HTML ค่าหากคุณจะแสดงในแบบฟอร์ม


2
โปรดสังเกตว่าRefererส่วนหัวสะกดต่างจากHTTP_REFERRERตัวแปรเซิร์ฟเวอร์
Rudey



9

เนื่องจาก Google จะนำคุณไปโพสต์นี้เมื่อค้นหาC# Web API Referrerนี่คือข้อตกลง: Web APIใช้ชนิดที่แตกต่างกันของRequestจากปกติMVC Requestที่เรียกว่าซึ่งไม่รวมถึงHttpRequestMessage UrlReferrerเนื่องจากWeb APIคำขอปกติไม่มีข้อมูลนี้หากคุณต้องการจริงๆคุณจึงต้องให้ลูกค้าของคุณออกนอกเส้นทางเพื่อรวมไว้ แม้ว่าคุณจะทำให้ส่วนที่เป็นแบบนี้ของคุณเป็นวิธีที่ดีคือการใช้งานAPI ObjectHeaders

ขั้นแรกคุณสามารถขยายHttpRequestMessageเพื่อระบุUrlReferrer()วิธีการ:

public static string UrlReferrer(this HttpRequestMessage request)
{
    return request.Headers.Referrer == null ? "unknown" : request.Headers.Referrer.AbsoluteUri;
}

จากนั้นลูกค้าของคุณต้องตั้งค่าReferrer HeaderของพวกเขาAPI Request:

// Microsoft.AspNet.WebApi.Client
client.DefaultRequestHeaders.Referrer = new Uri(url);

และตอนนี้Web API Requestรวมถึงข้อมูลผู้อ้างอิงซึ่งคุณสามารถเข้าถึงได้จากWeb API:

Request.UrlReferrer();


2

บางครั้งคุณต้องให้ลิงค์ทั้งหมดเช่นนี้

System.Web.HttpContext.Current.Request.UrlReferrer.ToString();

(ในตัวเลือกเมื่อไม่ได้ก่อตั้ง "ปัจจุบัน")


0

จากการตอบกลับอื่นฉันได้เพิ่มเงื่อนไขสำหรับการรับค่าว่าง

string ComingUrl = "";
if (Request.UrlReferrer != null)
{
    ComingUrl = System.Web.HttpContext.Current.Request.UrlReferrer.ToString();
}
else
{
    ComingUrl = "Direct"; // Your code
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.