C# Sitecore:如何拒绝访问站点根项目之外的项目
我试图将内容树中的项目隐藏在我的站点根项目之外,以便URL无法访问这些项目 我的两种方法不起作用: 第一个是使用Web.config中的设置C# Sitecore:如何拒绝访问站点根项目之外的项目,c#,sitecore,C#,Sitecore,我试图将内容树中的项目隐藏在我的站点根项目之外,以便URL无法访问这些项目 我的两种方法不起作用: 第一个是使用Web.config中的设置 这可以解决问题,但LinkManager开始引发异常。由于startItem为空,它试图从空字符串生成子字符串,因此崩溃 第二次尝试是实现一个ItemNotFound处理器,这样,如果我的项不是SiteRoot或它的后代,它会将上下文项设置为null并生成404例程 public class ItemNotFoundHandler : HttpRequ
这可以解决问题,但LinkManager开始引发异常。由于startItem为空,它试图从空字符串生成子字符串,因此崩溃
第二次尝试是实现一个ItemNotFound处理器,这样,如果我的项不是SiteRoot或它的后代,它会将上下文项设置为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;
}
}
这没有改变任何东西:上下文项保持不变。我不明白为什么
您能帮我吗?如果您不想浏览到
主页
节点之外的项目,您可以做的是让这些项目没有任何演示详细信息
然后,您可以将设置LayoutNotFoundUrl
更改为404页面:
<setting name="LayoutNotFoundUrl" value="/My404" />
我终于明白了。我反编译了Sitecore链接提供程序,发现了问题所在 第一种方法是正确的,只有一句话:startItem应该是空的 在计算rootPath时,考虑了“/”符号,它的长度变得太大,并且抛出了OutofRangeException。如果我删除了这个符号或者删除了startItem,就没有问题了
httprequest管道中的哪个位置连接此处理器?就在ItemResolverSitecore.Context.Item.Axes.IsDescendatof()之后-这将是一个性能问题。使用Sitecore.Context.Item.path.FullPath.StartsWith(Sitecore.Context.Site.StartPath)
代替整个部分。剩下的看起来应该有用。如果添加断点,它们是否被命中?是的,断点被命中,Do404()被执行,但我仍然将该项呈现为好像什么都没有发生一样
private void Do404()
{
Item item404 = Sitecore.Context.Database.GetItem(Settings.Error404ID);
Sitecore.Web.WebUtil.Redirect(LinkManager.GetItemUrl(item404));
}