Sitecore开发:如何隐藏内容树文件夹使其不显示在公开URL中
以下是针对该需求的三种常用实现方案,你可以根据你使用的Sitecore版本和业务场景选择:
方案1:使用系统自带字段快速配置(适配Sitecore 9.1及以上版本)
Sitecore 9.1之后的版本自带了URL层级排除功能,你只需要给A-Z分类文件夹的模板标准值勾选__Exclude from URL字段(归类在Link Provider字段组下),系统默认的链接生成逻辑就会自动跳过标记了该字段的层级,不会将其拼接到公开URL中。同时原生的URL解析逻辑也可以正常识别省略该层级后的路径,定位到对应的内容项。
操作步骤:- 找到你用于创建A-Z分类文件夹的模板,打开其标准值设置
- 在标准值的字段列表中找到
__Exclude from URL,勾选为启用状态 - 重建链接数据库,清空站点缓存后验证即可。配置完成后
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

