Sitecore 将项目路径转换为域名的位置



我正在运行多站点 Sitecore 6.5 安装,正在升级到 Sitecore 6.6。在 6.5 中,指向顶级域的链接行为正常,即指向/sitecore/content/mydomain/home 项目的链接解析为 mydomain.mysite.org,因为它是在 web.config 中通过<sites>条目设置的。

升级到 6.6 后,这不会发生。<sites>条目仍然存在,但 URL 仅指向 mysite.org/sitecore/content/mydomain.home。Sitecore 无法查明该问题,因为我们对基本设置进行了大量自定义(由设置网站的初始供应商完成)。我假设这些自定义之一是罪魁祸首,但我无法准确确定管道中正在分解的位置。

呈现链接的实际代码正在调用 Sitecore.Links.LinkManager.GetItemUrl(),该代码在安装 6.6. 升级包后立即返回错误的 URL。知道实际的域转换在哪里发生,所以我可以开始回退一些自定义,至少知道问题出在哪里?

更新:

这是web.config的<sites>部分(通过showconfig.aspx)。这是在应用迄今为止答案中的建议之后,即添加 targetHostName 并使主站点按站点条目的顺序排在最后。

    <sites>
        <site name="shell" virtualFolder="/sitecore/shell" physicalFolder="/sitecore/shell" rootPath="/sitecore/content" startItem="/home" language="en" database="core" domain="sitecore" loginPage="/sitecore/login" content="master" contentStartItem="/Home" enableWorkflow="true" enableAnalytics="false" xmlControlPage="/sitecore/shell/default.aspx" browserTitle="Sitecore" htmlCacheSize="2MB" registryCacheSize="3MB" viewStateCacheSize="200KB" xslCacheSize="5MB" />
        <site name="login" virtualFolder="/sitecore/login" physicalFolder="/sitecore/login" enableAnalytics="false" database="core" domain="sitecore" disableXmlControls="true" />
        <site name="admin" virtualFolder="/sitecore/admin" physicalFolder="/sitecore/admin" enableAnalytics="false" enableWorkflow="true" domain="sitecore" loginPage="/sitecore/admin/login.aspx" />
        <site name="service" virtualFolder="/sitecore/service" physicalFolder="/sitecore/service" />
        <site name="modules_shell" virtualFolder="/sitecore modules/shell" physicalFolder="/sitecore modules/shell" rootPath="/sitecore/content" startItem="/home" language="en" database="core" domain="sitecore" content="master" enableAnalytics="false" enableWorkflow="true" />
        <site name="modules_website" virtualFolder="/sitecore modules/web" physicalFolder="/sitecore modules/web" rootPath="/sitecore/content" startItem="/home" language="en" database="web" domain="extranet" allowDebug="true" cacheHtml="true" />
        <site name="ga_website" virtualFolder="/" physicalFolder="/" hostName="medicare.martinspoint.local" targetHostName="medicare.martinspoint.local" rootPath="/sitecore/content/GA" startItem="/home" database="web" domain="HQ" allowDebug="true" cacheHtml="false" htmlCacheSize="10MB" registryCacheSize="0" viewStateCacheSize="0" xslCacheSize="5MB" filteredItemsCacheSize="2MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" loginPage="http://martinspoint.local/account/login" />
        <site name="groupplan_website" virtualFolder="/" physicalFolder="/" hostName="groupplan.martinspoint.local" targetHostName="groupplan.martinspoint.local" rootPath="/sitecore/content/GroupPlan" startItem="/home" database="web" domain="HQ" allowDebug="true" cacheHtml="false" htmlCacheSize="10MB" registryCacheSize="0" viewStateCacheSize="0" xslCacheSize="5MB" filteredItemsCacheSize="2MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" />
        <site name="hcc_website" virtualFolder="/" physicalFolder="/" hostName="healthcarecenters.martinspoint.local" targetHostName="healthcarecenters.martinspoint.local" rootPath="/sitecore/content/HCC" startItem="/home" database="web" domain="HQ" allowDebug="true" cacheHtml="false" htmlCacheSize="10MB" registryCacheSize="0" viewStateCacheSize="0" xslCacheSize="5MB" filteredItemsCacheSize="2MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" />
        <site name="usfhp_website" virtualFolder="/" physicalFolder="/" hostName="tricare.martinspoint.local" targetHostName="tricare.martinspoint.local" rootPath="/sitecore/content/usfhp" startItem="/home" database="web" domain="HQ" allowDebug="true" cacheHtml="false" htmlCacheSize="10MB" registryCacheSize="0" viewStateCacheSize="0" xslCacheSize="5MB" filteredItemsCacheSize="2MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" loginPage="http://martinspoint.local/account/login" />
        <site name="my_martinspoint_website" virtualFolder="/" physicalFolder="/" hostName="connect.martinspoint.local" targetHostName="connect.martinspoint.local" rootPath="/sitecore/content/mymartinspoint" startItem="/home" database="web" domain="HQ" allowDebug="true" cacheHtml="false" htmlCacheSize="10MB" registryCacheSize="0" viewStateCacheSize="0" xslCacheSize="5MB" filteredItemsCacheSize="2MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" />
        <site name="martinspoint_website" virtualFolder="/" physicalFolder="/" hostName="martinspoint.local" targetHostName="martinspoint.local" rootPath="/sitecore/content/martinspoint" startItem="/home" database="web" domain="HQ" allowDebug="true" cacheHtml="false" htmlCacheSize="10MB" registryCacheSize="0" viewStateCacheSize="0" xslCacheSize="5MB" filteredItemsCacheSize="2MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" />
        <site name="website" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content" startItem="/home" database="web" domain="HQ" allowDebug="true" cacheHtml="false" htmlCacheSize="10MB" registryCacheSize="0" viewStateCacheSize="0" xslCacheSize="5MB" filteredItemsCacheSize="2MB" enablePreview="true" enableWebEdit="true" enableDebugger="true" disableClientData="false" />
        <site name="scheduler" enableAnalytics="false" domain="sitecore" />
        <site name="system" enableAnalytics="false" domain="sitecore" />
        <site name="publisher" domain="sitecore" enableAnalytics="false" enableWorkflow="true" />
    </sites>

Sitecore.Links.LinkManager.GetItemUrl的结果由配置中配置的LinkProvider决定,如下所示:

  <linkManager defaultProvider="sitecore">
    <providers>
      <clear />
      <add name="sitecore" type="Sitecore.Links.LinkProvider, Sitecore.Kernel"
           addAspxExtension="true" alwaysIncludeServerUrl="false" encodeNames="true" 
           languageEmbedding="asNeeded" languageLocation="filePath" 
           lowercaseUrls="false" shortenUrls="true" useDisplayName="false" />
    </providers>
  </linkManager>

您的供应商可能已使用自定义提供程序覆盖了该设置。

听起来您正在尝试从一个域链接到另一个域(或至少是子域)。确保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" />

正如Ruud所建议的那样,共享配置<sites>可能会有所帮助并检查targetHostName。它没有在 6.6 配置中列为值,但如果设置了多个主机名,则需要设置它。

还要验证您的<site>配置元素的顺序,以确定匹配的站点上下文。更具体的域应首先排序,因此mydomain.mysite.org应在mysite.org之前列出。

http://<url>/sitecore/admin/showconfig.aspx(或使用 Sitecore Rocks)检查您的最终配置,因为它可能会使用 Sitecore 包含文件进行修补。

编辑:我已经记住了问题所在:)

不幸的是,默认的 UrlOptions 和 LinkManager 忽略了Rendering.SiteResolving(或者可能是此特定版本的 Sitecore 中的一个错误),因为默认的链接提供程序不会初始化此设置!

您需要创建自己的链接提供程序,继承自 Sitecore 链接提供程序,并覆盖通过此设置的GetItemUrl()方法:

namespace Sitecore.Sample
{
    public class CustomLinkProvider : LinkProvider
    {
        public override string GetItemUrl(Item item, UrlOptions options)
        {
            // use the SiteResolving option set in config
            if (Sitecore.Context.PageMode.IsNormal)
                options.SiteResolving = Sitecore.Configuration.Settings.Rendering.SiteResolving;
            return base.GetItemUrl(item, options);
        }
    }
}

在您的配置中,与您的提供商切换:

<linkManager defaultProvider="customProvider">
  <providers>
    <clear />
    <add name="sitecore" ... />
    <add name="customProvider" type="Sitecore.Sample.CustomLinkProvider, Sitecore.Sample"
         addAspxExtension="true" alwaysIncludeServerUrl="false" encodeNames="true" 
         languageEmbedding="asNeeded" languageLocation="filePath" 
         lowercaseUrls="false" shortenUrls="true" useDisplayName="false" />
  </providers>
</linkManager>

您可以在这篇博文中阅读更多相关信息。

最新更新