【问题标题】:Two URLs that you can use to hit the homepage可用于访问主页的两个 URL
【发布时间】:2015-05-04 12:15:11
【问题描述】:

拥有一个 sitecore 网站。每个国家/地区的情况都有两个 URL 可用于访问主页。

www.abc.com/en/home

www.abc.com/en

我们只想要一个 - 这对 SEO 和分析都不利。 我想退休 www.abc.com/en/home 并希望 www.abc.com/en 只工作。

我已经使用嵌入式 URL = 始终在 web.config 中,但对我不起作用。

【问题讨论】:

  • 这是由于您的站点定义是如何设置的,而不是语言嵌入。您可以添加您的站点定义吗?
  • 这里是:
  • 您的网站定义正确。我刚刚在我的一个项目中对其进行了测试,并发现了相同的行为。我会用我推荐的操作写一个答案。

标签: redirect seo sitecore


【解决方案1】:

如果您在 LinkManager 中使用 LanguageEmbedding.Always。 使用 Sitecore LinkManager 生成的链接始终具有语言代码。 但其他网址也可以。

您可以使用 Canonical see Tip 17 搜索引擎。

或者,如果网址与您想要的网址不匹配,您可以进行重定向。

或阻止/重定向您 netwerk/loadbalancer/webserver 或重定向模块或 Sitecore <httpRequestBegin>pipeline 中的 url。 (只要你觉得方便)

一个简单的解决方案是在母版页中放置一段代码,如下所示:

string baseUrl = LinkManager.GetItemUrl(Sitecore.Context.Item);
if (baseUrl != Request.Path)
{
    Response.RedirectPermanent(baseUrl);
}

也适用于网址别名。

【讨论】:

  • Canonical 不起作用,因为它只是影响数据库索引,但用户仍然可以点击/感知这两种类型的 URL。我正在尝试字符串 requestedUrl = HttpContext.Current.Request.Url.ToString().ToLower(); if (requestedUrl.Contains("/en/home")) { redirectUrl=requestedUrl.Replace("/en/home", "/en"); } 在重定向模块中,但对我不起作用。请提供更多输入 以上示例仅用于测试,请勿与 /en/home 或 /en 混淆
  • 可能还有更多的url试试:/en/home.aspx 和/en/home.ashx 项目解析器也可以处理。重定向代码似乎适合该特定 URL。你把那个代码放在哪里?建议始终使用链接管理器生成 url。
  • 非常感谢,它确实有效。我用过同样的,现在一切都很好。真的很感激,因为我看到很多博客都包含同样的问题,希望大家能从中得到帮助。
  • 嘿,一个新的发现是,通常站点核心页面会设置 cookie,因此在上面的代码中编写代码不能很好地使用 cookie。所以我所做的是在写入根重定向异常的地方添加了这段代码。字符串 baseUrl = Sitecore.Links.LinkManager.GetItemUrl(Sitecore.Context.Item); if (baseUrl != Request.Path) { Response.Redirect(baseUrl); } 现在它可以很好地与语言代码和国家/地区 ID 等 cookie 配合使用。
  • 嗨#jan bluemink,您的提示对我来说非常有效,但这里有个问题。我们也有北欧国家的重定向,在应用这些代码时,带有查询字符串“?country =”的北欧国家被困在重定向循环中。我如何使用 baseurl 和 request.path 自定义您的代码,以便它与附加的查询字符串一起工作。当我尝试这样做比之前修复我的错误时,其中两个 url 正在工作,即一个与 /home 和一个没有 /home 得到重现。请帮助您的建议。提前致谢。
【解决方案2】:

使用具有以下规则的 IIS URL 重写模块:

<rule name="Redirect home" stopProcessing="true">
    <match url="^/en/home/?$" />
    <action type="Redirect" url="/en/" />
</rule>

【讨论】:

  • 嗨,我之前尝试过,它在使用部分和其他配置管理后确实可以工作,但问题是每个人都不鼓励在分布式环境中更改配置文件。所以,是的..这也是一种解决方案,所以谢谢,它的硬编码太多了。
  • 我有一个在 3 个 azure 数据中心中运行的全球平台,每周使用它为超过一百万个请求提供服务。我很想知道为什么不鼓励在分布式环境中更改配置文件。这取决于您如何将这些更改合并到您的项目和自动构建中。更改 IIS 配置可以在几秒钟/几分钟内完成。更改代码需要数周时间。
  • 嘿,也许我的解释有点错误。实际上,我们有超过 25 个语言环境,我们希望在每个语言环境中实现这一点。你是绝对正确的。配置更改如此之快,在我的情况下有点复杂。所以我在 linkprovider.cs 中做了一个更改,即 if (item == null || item.Name.Equals("Home") || db == null) { url = string.Format("/{0}/" , Sitecore.Context.Language.ToString());以及上面 Jan Bluemink 在主页上的代码,它对我来说工作正常,但也感谢最好的替代解决方案。
  • 如果你能写正则表达式,你有多少语言环境都没有关系。 ea 如果您需要重定向任何语言 url,请使用以下规则: 这基本上捕获了要重写的 url 的语言部分,删除了 home 部分。如果你需要扩展它以包含检测扩展,我也可以给你一个规则。
  • 是的,请务必提供给我。这在不同的情况下将非常有帮助。我已经记下了我从这个页面得到的所有解决方案。再次感谢伊万。而且,由于我是开发新手,所以请您向我提供有关如何为此设置配置部分的建议。我以某种方式做到了,但只是想从专家那里得到一个确认的解决方案。
【解决方案3】:

在你们所有人的帮助下,我的错误终于解决了,我想出了适用于各种情况的代码,例如附加查询字符串或不附加查询字符串。

string baseUrl = Sitecore.Links.LinkManager.GetItemUrl(Sitecore.Context.Item);
                if (baseUrl.ToLower().Contains("?"))
                {
                    baseUrl = Request.RawUrl.Substring(0, Request.RawUrl.IndexOf("?"));
                }
                string Qurl = Request.RawUrl;
                string AppendedUrl = string.Empty;

                if (Qurl.ToLower().Contains("?"))
                { 
                    Qurl = Request.RawUrl.Substring(0, Request.RawUrl.IndexOf("?")); 
                    AppendedUrl = Request.RawUrl.Substring(Qurl.Length);
                }
                string fullPath = baseUrl + AppendedUrl;
                if (baseUrl != Qurl)
                {
                    Response.RedirectPermanent(fullPath);
                }
            }
        }

试试这个:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-16
    • 2017-11-16
    • 2018-07-17
    • 2021-11-14
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多