Sitecore允许访问父节点周围的子节点

时间:2013-10-25 05:43:19

标签: asp.net sitecore google-search

我有一个sitecore多站点设置。

我目前正在努力应对重复内容综合症"谷歌机器人索引我的网站,并能够访问对方网站的内容。

这意味着它在2个不同的主机名上找到相同的内容,这使得网站在Google搜索中的评分较低。

它找到重复内容的原因是我能够通过在URL中键入名称来访问oppsosite网站上的子节点,而不是我当前正在浏览的子节点。

这是我的网站的web.config设置:

  

<网站名称=&#34;网站2&#34;主机名=&#34; local.domain.dk&#34; virtualFolder =&#34; /&#34; &GT; physicalFolder =&#34; /&#34; ROOTPATH =&#34; / Sitecore的/内容/谈话&#34;起始物品=&#34; /&#34;数据库=&#34;网络&#34;域=&#34;外联网&#34; allowDebug =&#34;真&#34; cacheHtml =&#34;真&#34; htmlCacheSize =&#34; 10MB&#34; registryCacheSize =&#34; 0&#34; viewStateCacheSize =&#34; 0&#34; xslCacheSize =&#34; 5MB&#34; filteredItemsCacheSize =&#34; 2MB&#34; enablePreview =&#34;真&#34; enableWebEdit =&#34;真&#34; enableDebugger =&#34;真&#34; disableClientData =&#34;假&#34; /&GT;

     

<网站名称=&#34;网站&#34; virtualFolder =&#34; /&#34; physicalFolder =&#34; /&#34; &GT; ROOTPATH =&#34; / Sitecore的/内容/家&#34;起始物品=&#34; /&#34;数据库=&#34;网络&#34;域=&#34;外联网&#34; allowDebug =&#34;真&#34; cacheHtml =&#34;真&#34; htmlCacheSize =&#34; 10MB&#34; registryCacheSize =&#34; 0&#34; viewStateCacheSize =&#34; 0&#34; xslCacheSize =&#34; 5MB&#34; filteredItemsCacheSize =&#34; 2MB&#34; enablePreview =&#34;真&#34; enableWebEdit =&#34;真&#34; enableDebugger =&#34;真&#34; disableClientData =&#34;假&#34; /&GT;

即使我将根路径设置为每个站点的根目录,我仍然可以通过键入local.domain-talk / integration来访问local.domain.dk/ydelser/integration的子节点。

非常感谢任何帮助!

5 个答案:

答案 0 :(得分:1)

您需要确保在hostName配置中设置了targetHostName<site>属性。这将确保当您链接到站点之间的内容时,链接将呈现完整的URL,包括主机名。

hostName: The host name of the incoming url. May include wildcards (ex. www.site.net, *.site.net, *.net, pda.*, print.*.net)
          It's possible to set more than one mask by using '|' symbol as a separator (ex. pda.*|print.*.net)
targetHostName: The host name to use when generating URLs to items within this site from the context of another site.
          If the targetHostName attribute is absent, Sitecore uses the value of the hostName attribute instead.
          Used only when the value of the Rendering.SiteResolving setting is true.

并确保Rendering.SiteResolving=true

  <!--  SITE RESOLVING
        While rendering item links, some items may belong to different site. Setting this to true
        make LinkManager try to resolve target site in order to use the right host name.
        Default value: true
  -->
  <setting name="Rendering.SiteResolving" value="true" />

您将始终能够访问具有完整路径的页面,因此Jens说添加规范链接标记。一旦您解决了跨网站链接和规范链接问题,那么谷歌机器人应该关注干净的链接。

答案 1 :(得分:0)

似乎您错过了“网站”节点配置中的hostname属性。 如果你有2个网站,你还需要2个网站节点,并带有相应的主机名。

您在管道中不使用任何自定义项解析程序?这也可能导致这种情况

答案 2 :(得分:0)

Sitecore在多站点链接生成方面存在许多问题,其中一些已在最新版本的6.6中解决:http://sdn.sitecore.net/Products/Sitecore%20V5/Sitecore%20CMS%206/ReleaseNotes/ChangeLog/Release%20History%20SC66.aspx#660update6(查找有关链接提供程序更改的部分)。

添加一些针对跨站点噪音的额外保护措施也是相当简单的。你可以在httpRequestBegin管道中的ItemResolver之后添加一个这样的步骤(对不起,有点时间写一个可编译的例子,这应该给出了想法):

Item siteRoot = Sitecore.Context.Site.StartItem;
if (!(Sitecore.Context.Item.ID == siteRoot.ID || Sitecore.Context.Item.Axes.IsDescendantOf(siteRoot))
  // break and do 404

答案 3 :(得分:0)

Sitecore解析项目的方式使得可以访问多个站点和多个域中的页面。

如果您有以下结构:

-sitecore
--content
--- SITE1
---- site1page1
---站点2
---- site2page1

并且site1的域名为site1.com,而site2的域名为site2.com,您始终可以使用其完整路径来查找项目。因此,例如,您可以访问site1上的site2页面,如下所示:

site1.com/sitecore/content/site2/site2page1.aspx

有关SEO的处理方法有多种,但最简单的方法是在元数据中使用规范链接,这样Google就不会将其视为重复内容。然后,您可以添加逻辑以使用所需页面上的URL呈现元标记。

如果您不希望允许来自一个站点的页面显示在另一个站点上,则应为每个站点创建不同的域,然后使用Sitecore安全性禁止从一个站点到另一个站点的读取访问。例如,您可以将site1创建为域,然后限制该域中site2项的读取访问权限。

答案 4 :(得分:0)

我同意标准的ItemResolver对URL过于宽容。您不仅可以在任何站点中获得相同的页面,还可以使用完整的Sitecore路径(例如/ sitecore / content / Site / page)获得重复的页面。在一个项目中,这对客户来说是一个大问题,我创建了一个更严格的自定义ItemResolver。这是:

public class ItemResolver : Sitecore.Pipelines.HttpRequest.ItemResolver
{
    public override void Process(HttpRequestArgs args)
    {
        Assert.ArgumentNotNull(args, "args");
        if (((Context.Item == null) && (Context.Database != null)) && (args.Url.ItemPath.Length != 0))
        {
            if (Context.Domain.Name.ToLower() == "sitecore")
            {
                base.Process(args);
                return;
            }

            Profiler.StartOperation("Resolve current item.");
            string path = MainUtil.DecodeName(args.Url.ItemPath);
            Item item = args.GetItem(path);
            if (item != null)
            {
                Tracer.Info("Current item is \"" + path + "\".");
            }
            Context.Item = item;
            Profiler.EndOperation();
        }
    }
}

如果将其与反编译的标准ItemResolver进行比较,您将看到它与第一步使用的代码相同。如果第一步失败,它只是不尝试使用其他方法找到该项目。这样做的另一个好处是它的运行速度比标准的ItemResolver快一点。