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

.NET Core 5 路径缺失指定子文件夹时的URL重定向问题求助

.NET Core 5 实现缺失/mytest/前缀的URL重定向

你之前的代码仅处理了根路径(空路径)的情况,无法覆盖mysite.com/mypage这类非根路径的请求。要实现所有不含/mytest前缀的请求都重定向到带该前缀的路径,可按以下方式调整:

正确的重写规则代码

在Startup.cs的Configure方法中,将重写逻辑修改为以下内容(注意中间件顺序,UseRewriter需放在UseRouting、UseStaticFiles之前):

app.UseRewriter(new RewriteOptions().Add(context =>
{
    var request = context.HttpContext.Request;
    var targetPrefix = "/mytest";

    // 检查请求路径是否不以/mytest开头
    if (!request.Path.StartsWithSegments(targetPrefix, StringComparison.OrdinalIgnoreCase))
    {
        // 构造完整的目标URL:协议+主机+PathBase+目标前缀+原路径+查询字符串
        var newPath = targetPrefix + request.Path;
        var redirectUrl = $"{request.Scheme}://{request.Host}{request.PathBase}{newPath}{request.QueryString}";
        
        // 执行重定向,permanent设为true返回301(永久重定向),false则是302(临时)
        context.HttpContext.Response.Redirect(redirectUrl, permanent: true);
        // 终止后续中间件处理
        context.Result = RuleResult.EndResponse;
    }
}));

代码说明

  • 使用StartsWithSegments判断路径前缀,比直接字符串对比更可靠,能正确处理路径分隔符的边界情况
  • 构造完整URL而非仅拼接路径,避免因PathBase、协议/主机差异导致重定向错误
  • RuleResult.EndResponse确保重定向后不再触发后续中间件逻辑
  • 若需要排除特定路径(如健康检查接口),可在判断条件中添加排除项:
    if (!request.Path.StartsWithSegments(targetPrefix, StringComparison.OrdinalIgnoreCase)
        && !request.Path.Equals("/healthcheck", StringComparison.OrdinalIgnoreCase))
    

完整Configure方法示例

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    // 重写中间件需放在路由、静态文件中间件之前
    app.UseRewriter(new RewriteOptions().Add(context =>
    {
        var request = context.HttpContext.Request;
        var targetPrefix = "/mytest";

        if (!request.Path.StartsWithSegments(targetPrefix, StringComparison.OrdinalIgnoreCase))
        {
            var newPath = targetPrefix + request.Path;
            var redirectUrl = $"{request.Scheme}://{request.Host}{request.PathBase}{newPath}{request.QueryString}";
            
            context.HttpContext.Response.Redirect(redirectUrl, permanent: true);
            context.Result = RuleResult.EndResponse;
        }
    }));

    app.UseStaticFiles();
    app.UseRouting();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:43:13