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>
我试图将内容树中的项目隐藏在我的站点根项目之外,以便 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>