Redirect 两个URL,您可以使用它们访问主页

Redirect 两个URL,您可以使用它们访问主页,redirect,seo,sitecore,Redirect,Seo,Sitecore,拥有一个sitecore网站。情况是,对于每个国家,都有两个URL可以用来访问主页 www.abc.com/en/home 及 www.abc.com/en 我们只想要一个-这对搜索引擎优化和分析都不好。 我想退休,只想工作 我已经在web.config中使用了embedded URL=always,但对我不起作用。如果使用LanguageEmbedded。总是在LinkManager中。 使用Sitecore LinkManager生成的链接始终具有语言代码。 但其他URL也可以使用 您可以使

拥有一个sitecore网站。情况是,对于每个国家,都有两个URL可以用来访问主页

www.abc.com/en/home

www.abc.com/en

我们只想要一个-这对搜索引擎优化和分析都不好。 我想退休,只想工作


我已经在web.config中使用了embedded URL=always,但对我不起作用。

如果使用LanguageEmbedded。总是在LinkManager中。 使用Sitecore LinkManager生成的链接始终具有语言代码。 但其他URL也可以使用

您可以使用搜索引擎的规范see

或者,如果url与所需的url不匹配,则可以执行重定向

或阻止/重定向网络/loadbalancer/webserver中的url,或重定向模块或Sitecore管道。(只要你觉得方便)

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

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

也适用于url别名。

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

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

在大家的帮助下,我的错误终于被解决了,我想出了在任何情况下都能工作的代码,比如附加查询字符串或不附加查询字符串

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);
                }
            }
        }

试试这个:)

这是因为站点定义是如何设置的,而不是语言嵌入。你能添加你的站点定义吗?这里是:你的站点定义是正确的。我只是在我的一个项目上测试了它,发现了同样的行为。我将用我推荐的操作写一个答案。Canonical不起作用,因为它只是影响数据库索引,但用户仍然可以点击/感知这两种类型的URL。我正在尝试string requestedUrl=HttpContext.Current.Request.Url.ToString().ToLower();如果(requestedUrl.Contains(“/en/home”){redirectUrl=requestedUrl.Replace(“/en/home”),“/en”);}在重定向模块中,但不适用于我。请提供更多输入以上示例仅用于测试,不要与/en/home或/en混淆可能有更多URL尝试:/en/home.aspx和/en/home.ashx项目解析器也可以处理它。重定向代码似乎适合该特定URL。你把密码放哪儿了?推荐始终使用链接管理器生成url。非常感谢,它确实有效。我用过同样的,现在一切都很好。我真的很感激,因为我看到很多博客都有同样的问题,希望大家都能从中得到帮助。嘿,一个新的发现是,通常sitecore页面都会设置cookie,所以编写上面的代码对cookie不起作用。所以我所做的就是在编写根重定向异常的地方添加了这段代码。string baseUrl=Sitecore.Links.LinkManager.GetItemUrl(Sitecore.Context.Item);如果(baseUrl!=Request.Path){Response.Redirect(baseUrl);}现在它可以很好地处理语言代码和国家id之类的cookie。嗨#jan bluemink,你的提示对我来说非常有效,但这里有个问题。我们在重定向中也有北欧国家,在应用这些代码时,带有querystring“”country=“的北欧国家在重定向循环中被卡住了。如何使用baseurl和request.path自定义代码,使其与附加的querystring配合使用。当我尝试这样做时,我的bug的前一个修复程序出现了两个url,即一个使用/home,另一个不使用/home。请帮忙提建议。提前谢谢。您好,我以前试过,在使用节和其他配置进行管理之后也可以使用,但问题是每个人都不希望在分布式环境中更改配置文件。所以,是的。。这也是一个解决方案,谢谢,它太硬了。我有一个全球平台运行在3个azure数据中心,每周使用它服务超过一百万个请求。我很想知道为什么在分布式环境中不鼓励更改配置文件。这取决于您如何将这些更改合并到项目和自动化构建中。更改IIS配置只需几秒钟/分钟。修改代码需要几个星期。嘿,也许我的解释有点错误。实际上,我们有超过25个语言环境,我们希望在每个语言环境中都实现这一点。你完全正确。配置更改非常快,对我来说有点复杂。因此,我在linkprovider.cs中做了一个更改,即如果(item==null | | | item.Name.Equals(“Home”)| | db==null){url=string.Format(“/{0}/”,Sitecore.Context.Language.ToString());上面是Jan Bluemink在主页上的一段代码,对我来说很好,不过也感谢您提供了最佳的替代解决方案。如果您可以编写regex,则不管您有多少个区域设置。如果您需要重定向任何语言url,请使用此规则:这基本上会捕获要重写的url的语言部分,删除主页部分。如果你需要扩展它以包含检测扩展,我也可以给你一个规则。是的,请提供给我。这在不同的场景中会非常有帮助。我已经记下了我从本页获得的所有解决方案。再次感谢Ivan。而且,由于我是开发中的新手,所以你能为我提供关于如何使用检测扩展的建议吗为此设置配置部分。我不知怎么做了,但只是想从专家那里得到一个确认的解决方案。