我正在尝试隐藏“我的网站根”项目之外的“内容”树中的项目,以便它们无法通过网址访问。
我的两种方法都不起作用:
第一个是在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项保持不变。我不明白为什么。
你可以帮帮我吗?答案 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>