Sitecore:如何拒绝访问站点根项目之外的项目

Sitecore: How to deny access to items outside the Site Root Item

我试图将内容树中的项目隐藏在我的站点根项目之外,以便 URL 无法访问它们。

我的两个方法都不起作用:

第一个是玩 Web.config

中的设置
<sites>
    <site name="website" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content/home" startItem="/" database="web" .../>
</sites>

这可以解决问题,但 LinkManager 开始引发异常。由于 startItem 为空,它试图从空字符串创建子字符串,它崩溃了。

第二次尝试是实现 ItemNotFound 处理器,这样如果我的 Item 不是 SiteRoot 或其后代,它将 Context item 设置为 null 并生成 404 例程。

public class ItemNotFoundHandler : HttpRequestProcessor
{
    public override void Process(HttpRequestArgs args)
    {
        if (Sitecore.Context.Item != null && Sitecore.Context.Site.Name == "website")
        {
            Item siteroot = Sitecore.Context.Database.GetItem(Settings.SiteRootID);

            if (Sitecore.Context.Item.ID != siteroot.ID && !Sitecore.Context.Item.Axes.IsDescendantOf(siteroot))

                //Do404();
                Sitecore.Context.Item = null;
        }

        if (Sitecore.Context.Item != null  || Sitecore.Context.Site == null || Sitecore.Context.Database == null)
            return;



        Do404();
    }

    private void Do404()
    {
        Item item404 = Sitecore.Context.Database.GetItem(Settings.Error404ID);
        Sitecore.Context.Item = item404;
    }
}

这并没有改变任何东西:上下文项保持不变。我不明白为什么。

你能帮帮我吗?

如果您不想浏览到 Home 节点之外的项目,您可以做的是让这些项目没有任何显示详细信息。

然后您可以将设置 LayoutNotFoundUrl 更改为您的 404 页面:

<setting name="LayoutNotFoundUrl" value="/My404" />

如果您出于某种原因确实想要在这些节点上显示详细信息,或者如果上述方法由于任何其他原因不起作用,为什么不直接在 Do404 方法中调用您的 404 页面呢?

private void Do404()
{
    Item item404 = Sitecore.Context.Database.GetItem(Settings.Error404ID);
    Sitecore.Web.WebUtil.Redirect(LinkManager.GetItemUrl(item404));
}

我终于明白了。我反编译了 Sitecore LinkProvider 并看到了问题所在。

第一种方法是正确的,只需要注意一点:startItem 应该为空。

在计算rootPath时考虑了“/”符号,长度变大了一个符号,抛出了OutOfRangException。如果我删除这个符号或完全删除 startItem,就没有问题了。

<sites>
    <site name="website" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content/home" startItem="" database="web" .../>
</sites>