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

.NET 8 Razor Pages如何移除页面默认路由,禁止直接访问原路径?

移除.NET 8 Razor Pages默认路由,仅保留自定义数据库路由

方法1:通过路由约定清除默认路由并添加自定义路由

在配置Razor Pages路由时,对每个页面先清除所有现有路由模板,再添加从数据库获取的自定义路由。这样就能彻底移除默认的文件路径路由,只保留你配置的自定义路由。

// 假设routesFromDb是从数据库查询到的路由集合,每个route包含FullName(页面路径如"/Account/Login")和Key(自定义路由值如"A64592D0-05AD-4E0D-8A0C-5E5259800A19")
foreach (var route in routesFromDb)
{
    options.Conventions.ForPage(route.FullName)
           .ClearRouteTemplates() // 清除该页面的所有默认路由模板
           .AddPageRoute(route.FullName, route.Key.ToString()); // 添加自定义路由
}

ClearRouteTemplates()会移除页面所有默认的路由规则,之后只保留你通过AddPageRoute添加的自定义路由,用户就无法再通过/Account/Login这类默认路径访问页面了。

方法2:使用页面过滤器拦截默认路径访问

如果方法1无法满足需求(比如某些页面需要保留部分路由),可以通过页面过滤器拦截对默认路径的请求,直接返回404或其他自定义结果。

1. 创建页面过滤器类

public class BlockDefaultRouteFilter : IPageFilter
{
    private readonly IRouteRepository _routeRepository; // 注入你的路由数据访问服务

    public BlockDefaultRouteFilter(IRouteRepository routeRepository)
    {
        _routeRepository = routeRepository;
    }

    public void OnPageHandlerSelected(PageHandlerSelectedContext context)
    {
        // 获取当前页面的完整路径(不含.cshtml后缀)
        var pageFullPath = context.ActionDescriptor.RelativePath.Replace(".cshtml", string.Empty);
        var requestPath = context.HttpContext.Request.Path.Value?.Trim('/') ?? string.Empty;

        // 获取该页面所有合法的自定义路由键
        var validRouteKeys = _routeRepository.GetRoutesForPage(pageFullPath)
                                             .Select(r => r.Key.ToString().Trim('/'))
                                             .ToList();

        // 检查请求路径是否是页面默认路径,且不在合法自定义路由列表中
        var defaultPagePath = pageFullPath.Trim('/');
        if (requestPath.Equals(defaultPagePath, StringComparison.OrdinalIgnoreCase) 
            && !validRouteKeys.Contains(requestPath, StringComparer.OrdinalIgnoreCase))
        {
            // 返回404,也可以根据需求返回其他结果(如跳转至自定义路由)
            context.Result = new NotFoundResult();
        }
    }

    public void OnPageHandlerExecuting(PageHandlerExecutingContext context) { }
    public void OnPageHandlerExecuted(PageHandlerExecutedContext context) { }
}

2. 注册过滤器

在Program.cs中添加过滤器的依赖注入:

builder.Services.AddScoped<IPageFilter, BlockDefaultRouteFilter>();

关于@page指令的说明

你之前尝试修改@page指令的方式无效,是因为@page指令只会添加路由模板,不会移除默认的文件路径路由。即使你设置了一个无用的值,页面仍然会保留默认的路由规则。所以必须通过路由约定或过滤器的方式来彻底禁用默认路由。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:18:19