0

我有一个 sitecore 多站点设置。

我目前正在与“重复内容综合症”作斗争,因为谷歌机器人索引我的网站并且能够访问对面网站的内容。

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

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

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

<站点名称="website2" hostName="local.domain.dk" virtualFolder="/" >physicalFolder="/" rootPath="/sitecore/content/talk" startItem="/" database="web" domain="extranet " allowDebug="true" cacheHtml="true" htmlCacheSize="10MB" registryCacheSize="0" viewStateCacheSize="0" xslCacheSize="5MB" filteredItemsCacheSize="2MB" enablePreview="true" enableWebEdit="true" enableDebugger="true " disableClientData="false"/>

<站点名称="website" virtualFolder="/" physicalFolder="/" >rootPath="/sitecore/content/home" startItem="/" database="web" domain="extranet" allowDebug="true" cacheHtml=" true" htmlCacheSize="10MB" registryCacheSize="0" viewStateCacheSize="0" xslCacheSize="5MB" filteredItemsCacheSize="2MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false"/>

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

任何帮助将非常感激 !

4

5 回答 5

1

您需要确保在配置中设置了hostNameandtargetHostName属性<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 所说,添加规范链接标签。一旦你解决了跨站链接和规范链接问题,那么谷歌机器人应该只遵循干净的链接。

于 2013-10-25T14:11:42.107 回答
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
于 2013-10-25T08:52:16.620 回答
0

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

您没有在管道中使用任何自定义项目解析器吗?这也可能导致

于 2013-10-25T06:31:46.290 回答
0

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

如果你有以下结构:

-sitecore
--content
---site1
----site1page1
---site2
----site2page1

并且 site1 有域 site1.com 和 site2 有 site2.com,你总是可以用它的完整路径来寻址一个项目。因此,例如,您可以像这样在 site1 上访问 site2 的页面:

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

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

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

于 2013-10-25T08:58:02.767 回答
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 快一点。

于 2013-10-29T15:13:02.783 回答