You need to enable JavaScript to run this app. Sitecore开发:如何隐藏内容树文件夹使其不显示在公开URL中
优惠活动
大模型
产品
解决方案
定价
更多

Sitecore开发:如何隐藏内容树文件夹使其不显示在公开URL中

Sitecore隐藏中间分类文件夹的实现方案

以下是针对该需求的三种常用实现方案,你可以根据你使用的Sitecore版本和业务场景选择:

  • 方案1:使用系统自带字段快速配置(适配Sitecore 9.1及以上版本)
    Sitecore 9.1之后的版本自带了URL层级排除功能,你只需要给A-Z分类文件夹的模板标准值勾选__Exclude from URL字段(归类在Link Provider字段组下),系统默认的链接生成逻辑就会自动跳过标记了该字段的层级,不会将其拼接到公开URL中。同时原生的URL解析逻辑也可以正常识别省略该层级后的路径,定位到对应的内容项。
    操作步骤:

    1. 找到你用于创建A-Z分类文件夹的模板,打开其标准值设置
    2. 在标准值的字段列表中找到__Exclude from URL,勾选为启用状态
    3. 重建链接数据库,清空站点缓存后验证即可。配置完成后People/A/Alice生成的公开URL会自动变为People/Alice,访问该URL也能正常解析到Alice对应的内容项。
  • 方案2:自定义Link Provider与Item Resolver(适配低版本Sitecore或需要自定义规则的场景)
    如果你使用的Sitecore版本低于9.1,没有自带的URL排除字段,可以通过自定义逻辑实现需求:
    首先重写链接生成逻辑,拼接URL时跳过A-Z分类文件夹层级:

    public class CustomLinkProvider : LinkProvider
    {
        // 替换为你自己的A-Z分类文件夹模板ID
        private const string FolderTemplateId = "{你的A-Z文件夹模板ID}";
    
        public override string GetItemUrl(Item item, UrlOptions options)
        {
            var baseUrl = base.GetItemUrl(item, options);
            if (item.Parent.TemplateID.ToString() == FolderTemplateId)
            {
                baseUrl = baseUrl.Replace($"/{item.Parent.Name}/", "/");
            }
            return baseUrl;
        }
    }
    

    再配套自定义URL解析逻辑,保证省略了文件夹层级的URL可以正常定位到内容:

    public class CustomItemResolver : HttpRequestProcessor
    {
        // 替换为你自己的A-Z分类文件夹模板ID
        private const string FolderTemplateId = "{你的A-Z文件夹模板ID}";
        // 替换为你站点下People节点的实际路径
        private const string PeopleRootPath = "/sitecore/content/你的站点/People";
    
        public override void Process(HttpRequestArgs args)
        {
            if (Context.Item != null) return;
            
            var pathSegments = args.Url.ItemPath.Split('/').Where(p => !string.IsNullOrWhiteSpace(p)).ToList();
            // 只处理People路径下的请求
            if (pathSegments.Count < 2 || !pathSegments[0].Equals("People", StringComparison.OrdinalIgnoreCase)) return;
    
            var peopleRoot = Context.Database.GetItem(PeopleRootPath);
            if (peopleRoot == null) return;
            
            // 查找匹配名称的内容项
            // 如果条目数量较多,建议改用Content Search API查询,避免性能问题
            var targetItem = peopleRoot.Axes.GetDescendants()
                .FirstOrDefault(i => i.Name.Equals(pathSegments.Last(), StringComparison.OrdinalIgnoreCase)
                                    && i.Parent.TemplateID.ToString() == FolderTemplateId);
            
            if (targetItem != null) Context.Item = targetItem;
        }
    }
    

    最后将这两个自定义组件注册到你的Sitecore配置文件中即可生效。

  • 方案3:使用Item Buckets功能(适配人名条目数量较多的场景)
    如果你的人名条目数量很大,可以直接将People节点设置为Bucket,配置Bucket的自动分组规则为按内容项首字母生成A-Z文件夹,该场景下A-Z文件夹属于Bucket的内部收纳结构,默认就不会出现在公开URL中,所有Bucket内的内容项URL都会自动生成People/[内容项名称]的格式,不需要额外编写代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 02:18:00