ฉันกำลังมองหาวิธีที่รวดเร็วง่ายและเชื่อถือได้ในการรับHTTP Referrerของเบราว์เซอร์ในASP.Net ( C # ) ฉันรู้ว่าตัวอ้างอิง HTTP นั้นไม่น่าเชื่อถือ แต่ฉันต้องการวิธีที่เชื่อถือได้ในการรับผู้อ้างอิงหากมีอยู่
ฉันกำลังมองหาวิธีที่รวดเร็วง่ายและเชื่อถือได้ในการรับHTTP Referrerของเบราว์เซอร์ในASP.Net ( C # ) ฉันรู้ว่าตัวอ้างอิง HTTP นั้นไม่น่าเชื่อถือ แต่ฉันต้องการวิธีที่เชื่อถือได้ในการรับผู้อ้างอิงหากมีอยู่
คำตอบ:
คุณสามารถใช้คุณสมบัติUrlReferrerของคำขอปัจจุบัน:
Request.UrlReferrer
สิ่งนี้จะอ่านส่วนหัวReferer HTTP จากคำร้องขอซึ่งไคลเอ็นต์อาจให้หรือไม่ก็ได้ (ตัวแทนผู้ใช้)
Request.UrlReferrer
หลังการโพสต์แบ็คฝั่งเซิร์ฟเวอร์ แน่นอนว่าRequest.UrlReferrer
ตอนนี้จะมีมูลค่าของเพจที่คุณโพสต์กลับไป ในกรณีส่วนใหญ่ผู้คนต้องการหน้าก่อนหน้านี้ ในกรณีนี้ตรวจสอบให้แน่ใจว่าคุณจัดเก็บหน้าก่อนหน้านี้ในลักษณะบอกว่าตัวแปรวิวสเตทเมื่อโหลดหน้าครั้งแรก จากนั้นเมื่อคุณเข้าถึงตัวแปรนี้จะมีหน้าที่คุณมาจากก่อนหน้านี้ ตัวอย่างเช่นในเหตุการณ์การโหลดหน้าเว็บของ asp.net คุณสามารถทำได้:if (Request.UrlReferrer != null) ViewState["PreviousPageUrl"] = Request.UrlReferrer.ToString();
Response.Redirect(ViewState["PreviousPageUrl"] != null ? ViewState["PreviousPageUrl"].ToString() : "SomeOtherPage.aspx");
ใช้Request.UrlReferrer
ทรัพย์สิน.
ใต้ฉากเป็นเพียงการตรวจสอบServerVariables("HTTP_REFERER")
ทรัพย์สิน
UrlReferrer
ทำได้มากกว่าการเรียกง่ายๆServerVariables("HTTP_REFERER")
ServerVariables["HTTP_REFERER"]
ผลตอบแทนสตริงในขณะที่Request.UrlReferrer
ผลตอบแทนUri
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 ค่าหากคุณจะแสดงในแบบฟอร์ม
Referer
ส่วนหัวสะกดต่างจากHTTP_REFERRER
ตัวแปรเซิร์ฟเวอร์
ดังนี้คุณสมบัติ HttpRequest.UrlReferrer
Uri myReferrer = Request.UrlReferrer;
string actual = myReferrer.ToString();
ฉันใช้. Net Core 2 mvc อันนี้ใช้ได้สำหรับฉัน (เพื่อรับหน้าตัวอย่าง):
HttpContext.Request.Headers["Referer"];
เนื่องจาก Google จะนำคุณไปโพสต์นี้เมื่อค้นหาC# Web API Referrer
นี่คือข้อตกลง: Web API
ใช้ชนิดที่แตกต่างกันของRequest
จากปกติMVC Request
ที่เรียกว่าซึ่งไม่รวมถึงHttpRequestMessage
UrlReferrer
เนื่องจากWeb API
คำขอปกติไม่มีข้อมูลนี้หากคุณต้องการจริงๆคุณจึงต้องให้ลูกค้าของคุณออกนอกเส้นทางเพื่อรวมไว้ แม้ว่าคุณจะทำให้ส่วนที่เป็นแบบนี้ของคุณเป็นวิธีที่ดีคือการใช้งานAPI Object
Headers
ขั้นแรกคุณสามารถขยาย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();
string referrer = HttpContext.Current.Request.UrlReferrer.ToString();
บางครั้งคุณต้องให้ลิงค์ทั้งหมดเช่นนี้
System.Web.HttpContext.Current.Request.UrlReferrer.ToString();
(ในตัวเลือกเมื่อไม่ได้ก่อตั้ง "ปัจจุบัน")
จากการตอบกลับอื่นฉันได้เพิ่มเงื่อนไขสำหรับการรับค่าว่าง
string ComingUrl = "";
if (Request.UrlReferrer != null)
{
ComingUrl = System.Web.HttpContext.Current.Request.UrlReferrer.ToString();
}
else
{
ComingUrl = "Direct"; // Your code
}