Umbraco v7路由问题:Home节点外页面路径未堆叠的技术咨询
Umbraco v7 节点URL路径问题解答
嘿,这个问题我之前帮不少开发者理清楚过,咱们一步步来拆解:
为什么Home节点外的页面会跳过父节点路径?
Umbraco v7的路由机制默认是把Home节点当作整个站点的URL根节点的。也就是说:
- 所有Home节点下的子节点(比如你说的Home > Foo > Bar),URL会从Home的根路径(也就是域名)开始,逐层堆叠父节点的UrlName,最终生成
<domain>/foo/bar。 - 但如果是和Home同级的顶级节点(比如你创建的Content > Foo > Bar,这里Foo是顶级节点),Umbraco默认不会把这些节点纳入站点的层级路由体系里。它会直接取子节点Bar的UrlName作为URL,完全忽略父节点Foo的路径,所以就出现了
<domain>/bar的情况。
简单说,Umbraco默认只认Home作为站点的“入口根”,其他顶级节点的子节点不会继承父节点的路径。
能不能实现Home外节点和Home下节点一致的路径堆叠?
当然可以!这里有几种不同的方案,你可以根据自己的场景选:
方案1:自定义URL提供器(最灵活,适合大量节点)
Umbraco的URL生成是靠IUrlProvider接口来控制的,默认的DefaultUrlProvider只从Home节点开始拼接路径。咱们可以写一个自定义的URL提供器,让所有节点都基于自身的完整父节点路径来生成URL:
- 先创建一个自定义的URL提供器类:
using System; using System.Collections.Generic; using System.Linq; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Web; using Umbraco.Web.Routing; public class FullPathUrlProvider : DefaultUrlProvider { public FullPathUrlProvider(IRequestHandlerSection requestHandlerSection, IUmbracoContextAccessor umbracoContextAccessor) : base(requestHandlerSection, umbracoContextAccessor) { } public override IEnumerable<string> GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode) { var contentNode = umbracoContext.Content.GetById(id); if (contentNode == null) return Enumerable.Empty<string>(); var pathParts = new List<string>(); var currentNode = contentNode; // 遍历所有父节点,直到根节点 while (currentNode != null) { pathParts.Add(currentNode.UrlName); currentNode = currentNode.Parent; } // 反转路径(因为我们是从子节点往上遍历的) pathParts.Reverse(); // 拼接成完整URL var fullUrl = "/" + string.Join("/", pathParts); return new[] { fullUrl }; } }
- 然后在
Global.asax.cs里注册这个自定义提供器,替换掉默认的:
protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { base.ApplicationStarted(umbracoApplication, applicationContext); // 移除默认的URL提供器,添加我们自定义的 UrlProviderResolver.Current.RemoveType<DefaultUrlProvider>(); UrlProviderResolver.Current.AddType<FullPathUrlProvider>(); }
这样一来,所有节点(包括Home外的)都会生成完整的层级URL,比如Foo(顶级节点)的URL是<domain>/foo,Bar的URL就是<domain>/foo/bar。
方案2:手动设置节点的URL属性(适合少量节点)
如果你的非Home节点数量不多,也可以手动给每个节点设置umbracoUrl属性:
- 给Foo节点的“URL”字段设置为
/foo - 给Bar节点的“URL”字段设置为
/foo/bar
这种方法不用写代码,但每次新增节点都要手动配置,维护起来比较繁琐。
方案3:用多站点功能(适合独立站点场景)
如果Foo节点本身是一个独立的站点,你可以把它设置为另一个站点的Home节点:
- 进入Umbraco后台的Settings > Languages,确保有对应的语言(如果不需要多语言,用默认的就行)
- 进入Settings > Sites,新建一个站点,把Foo节点设为这个站点的Home节点
这样Foo的子节点就会自动生成层级URL,和主站点的Home节点逻辑一致。
内容的提问来源于stack exchange,提问作者hidarikani
相关产品推荐
相关产品推荐

