我看到您已经解决了这个问题,但对于未来的读者:
我遇到了同样的问题(Sitecore 6.6,ECM 1.2.0):
如果您的“Rendering.SiteResolving”设置为“true”,那么 Sitecore 将尽可能尝试使用子域,使您的内部链接使用在 SiteDefinition.config(或 web.config,如果您保留)中定义为 hostName 的子域您的网站定义)。
示例:如果您插入指向 sitecore/Content/Website/somesite 的内部链接,则在时事通讯中该链接应变为
http://yourdomain.com/sitecore/RedirectUrlPage.aspx?ec_url=/somesite?...
但是如果你有一个带有 hostName="somesite" 的站点定义,那么链接就会变成
http://yourdomain.com/sitecore/RedirectUrlPage.aspx?ec_url=http://somesite.yourdomain.com?....
如果您检查类 Sitecore.Modules.EmailCampaign.Core.EmailResponse,sitecore/RedirectUrlPage.aspx 继承自该类,您会看到:
string link = Context.Request.QueryString["ec_url"];
...
bool isInternal = link.StartsWith("/", StringComparison.OrdinalIgnoreCase) && !link.StartsWith("//", StringComparison.OrdinalIgnoreCase);
所以您的子域链接不再被接受为内部链接 - 然后发生这种情况:
if (!isInternal && !ExternalLinks.IsLinkRegistered(message, link))
throw new EmailCampaignException("The unregistered external link: " + link + " detected.");
您可以通过将 siteresolving-setting 更改为 false 轻松解决此问题。对我来说,这有几个原因是不可能的,所以这就是我所做的——如果你有更好的方法,请告诉我:
我让 RedirectUrlPage.aspx 从一个自定义类继承,该类称为自定义 EmailReponse。在这里,我将条件更改为:
bool isInternal = (link.StartsWith("/", StringComparison.OrdinalIgnoreCase) && !link.StartsWith("//", StringComparison.OrdinalIgnoreCase)) || link.IndexOf("yourdomain") > -1;
这行得通!
当然,硬编码的域名应该替换为 HttpContext.Current.Request.Url.Host 之类的东西,但我还没有在生产中完全测试过 - 将在下一次部署中进行。