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

时间:2015-04-14 08:16:31

标签: c# sitecore

我正在尝试隐藏“我的网站根”项目之外的“内容”树中的项目,以便它们无法通过网址访问。

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

第一个是在Web.config中使用设置

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

这可以解决问题,但LinkManager开始引发异常。由于startItem为空,它会尝试从空字符串中创建一个Substring,它会崩溃。

第二次尝试是实现一个ItemNotFound处理器,这样如果我的Item不是SiteRoot或它的后代,它会将Context项设置为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;
    }
}

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

你可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

如果您不希望能够浏览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));
}

答案 1 :(得分:1)

最后我明白了。我反编译Sitecore LinkProvider并查看问题所在。

第一种方法是正确的,只有一句话:startItem应为空。

&#34; /&#34;计算rootPath时会考虑符号,其长度变为一个符号太大,并抛出OutOfRangException。如果我删除此符号或删除startItem,则没有其他问题。

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