如何在Asp.net Core中识别用户的广告引流网站来源?
在ASP.NET Core中判断用户的广告来源网站
要通过UrlReferrer实现用户来源追踪,核心是获取请求的Referer头并处理来源信息,以下是具体实现步骤和注意事项:
1. 获取请求的Referrer信息
在Controller或Middleware中,有两种方式获取Referrer:
- 直接读取请求头:
Request.Headers["Referer"](返回字符串格式) - 使用强类型Uri对象:
Request.GetTypedHeaders().Referer(推荐,更方便解析域名、协议等信息)
示例代码(Controller中):
using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; public class HomeController : Controller { private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger) { _logger = logger; } public IActionResult Index() { var referrerUri = Request.GetTypedHeaders().Referer; if (referrerUri != null) { // 提取来源域名(例如从https://ad-partner-abc.com/promo中拿到ad-partner-abc.com) string sourceDomain = referrerUri.Host; // 将来源记录到日志或业务数据库 _logger.LogInformation("用户来自广告合作网站: {SourceDomain}", sourceDomain); // 临时存储来源信息,避免后续站内跳转后Referrer变为本站域名 HttpContext.Session.SetString("AdSource", sourceDomain); } else { // 无Referrer的场景:用户直接输入网址、隐私模式访问、浏览器禁用Referrer等 _logger.LogInformation("用户无有效来源Referrer"); } return View(); } }
2. 持久化来源信息
用户在站内跳转时,后续请求的Referrer会变为你的网站域名,因此需要把首次获取的来源信息持久化,常用两种方式:
- Session:适用于会话内追踪,会话结束后自动失效
- Cookie:可设置较长有效期,支持跨会话追踪用户来源
Cookie存储示例:
if (referrerUri != null && !Request.Cookies.ContainsKey("AdSource")) { string sourceDomain = referrerUri.Host; Response.Cookies.Append("AdSource", sourceDomain, new CookieOptions { Expires = DateTimeOffset.Now.AddDays(30), HttpOnly = true, // 防止前端JS读取,提升安全性 Secure = Request.IsHttps // HTTPS网站建议开启,仅在HTTPS环境下传输Cookie }); }
3. 补充方案:自定义URL参数
由于Referrer可能因浏览器隐私设置、重定向等场景丢失,建议同时配合自定义URL参数(如https://your-site.com?source=partner-x)作为补充,优先读取参数再降级到Referrer:
public IActionResult Index() { string source = Request.Query["source"]; if (!string.IsNullOrWhiteSpace(source)) { Response.Cookies.Append("AdSource", source, new CookieOptions { Expires = DateTimeOffset.Now.AddDays(30) }); } else { var referrerUri = Request.GetTypedHeaders().Referer; if (referrerUri != null) { Response.Cookies.Append("AdSource", referrerUri.Host, new CookieOptions { Expires = DateTimeOffset.Now.AddDays(30) }); } } return View(); }
注意事项
- 必须做空值判断:浏览器可能因隐私策略不发送Referer头,直接使用会引发空引用异常
- 跨协议场景限制:从HTTPS网站跳转到HTTP网站时,大多数浏览器不会发送Referrer
- 域名解析灵活处理:如果广告合作方有多个子域名,可根据需求提取主域名(如
sub.ad-partner.com提取为ad-partner.com)
内容的提问来源于stack exchange,提问作者Sina Yar
相关产品推荐
相关产品推荐

