You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 6 MVC中如何解析URL并构建新URL实现重定向?

解决ASP.NET Core 6 MVC中ReturnUrl带参数/完整域名的重定向问题

方案一:直接使用Redirect(推荐,最简洁)

不需要手动解析路径和参数,Redirect方法可以直接处理带查询参数的本地路径,以及信任的外部完整域名地址,同时要做好安全验证防止开放重定向攻击。

var returnUrl = Request.Query["ReturnUrl"].ToString();

// 优先验证本地URL,防止恶意跳转
if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
{
    return Redirect(returnUrl);
}
// 若需支持信任的外部域名,添加额外判断
else if (!string.IsNullOrEmpty(returnUrl) && returnUrl.StartsWith("https://www.mysite.com/", StringComparison.OrdinalIgnoreCase))
{
    return Redirect(returnUrl);
}
// 默认重定向到首页
return RedirectToAction("Index", "Home");

方案二:解析参数后用RedirectToAction(适合需映射路由参数的场景)

如果需要将URL中的查询参数转为路由参数(如把?id=123映射到路由{controller}/{action}/{id}),可以用Uri和QueryHelpers解析路径与参数:

var returnUrl = Request.Query["ReturnUrl"].ToString();

if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
{
    // 基于当前请求构造基准Uri,用于解析相对路径
    var baseUri = new Uri($"{Request.Scheme}://{Request.Host}");
    var targetUri = new Uri(baseUri, returnUrl);
    
    // 提取控制器和动作(Segments数组第一个元素为空,跳过)
    var pathSegments = targetUri.Segments.Where(s => !string.IsNullOrWhiteSpace(s.Trim('/'))).ToList();
    if (pathSegments.Count >= 2)
    {
        var controller = pathSegments[0].Trim('/');
        var action = pathSegments[1].Trim('/');
        
        // 解析查询参数为路由字典
        var queryParams = QueryHelpers.ParseQuery(targetUri.Query);
        var routeValues = new RouteValueDictionary();
        foreach (var kvp in queryParams)
        {
            routeValues[kvp.Key] = kvp.Value.FirstOrDefault();
        }
        
        return RedirectToAction(action, controller, routeValues);
    }
}

return RedirectToAction("Index", "Home");

关键注意事项

  • 开放重定向防护:永远不要直接重定向到未验证的ReturnUrl,Url.IsLocalUrl会自动识别以/、~/开头的本地路径,避免恶意跳转风险;若需支持外部域名,必须添加明确的白名单判断。
  • Redirect vs RedirectToAction:前者直接跳转至目标URL,适合保留原查询参数的场景;后者通过路由系统生成URL,适合需要统一路由规则的场景。

内容的提问来源于stack exchange,提问作者SuperNev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:02:37