Sitecore URL中的语言嵌入

Sitecore URL中的语言嵌入,sitecore,sitecore7,Sitecore,Sitecore7,我们创建了多语言网站在FR,ES,EN从旧的经典asp网站(这也是在3种语言)。在旧网站中,默认情况下,英文“en”没有嵌入到URL中。但在我们新的sitecore网站中,我有语言嵌入=“始终” 因此,当我们在Google中为301重定向从旧网站重定向到新网站时,如果我用法语打开我的新网站,并且从旧网站重定向为英语(这意味着在url中没有语言,即“en”),链接将指向法语版本 那么我如何才能在url中添加“en” HttpContext.Current.Request.RawUrl 我可以

我们创建了多语言网站在FR,ES,EN从旧的经典asp网站(这也是在3种语言)。在旧网站中,默认情况下,英文“en”没有嵌入到URL中。但在我们新的sitecore网站中,我有语言嵌入=“始终”

因此,当我们在Google中为301重定向从旧网站重定向到新网站时,如果我用法语打开我的新网站,并且从旧网站重定向为英语(这意味着在url中没有语言,即“en”),链接将指向法语版本

那么我如何才能在url中添加“en”

  HttpContext.Current.Request.RawUrl
我可以使用上面的内容获取原始url,但我不知道如何在浏览器url中显示“en”

旧网站链接:

www.abc.com/xyz.asp,
www.abc.com/fr/xyz.asp,
www.abc.com/es/xyz.asp
www.abc.com/en/xyz.aspx,
www.abc.com/fr/xyz.aspx,
www.abc.com/es/xyz.aspx
新网站链接:

www.abc.com/xyz.asp,
www.abc.com/fr/xyz.asp,
www.abc.com/es/xyz.asp
www.abc.com/en/xyz.aspx,
www.abc.com/fr/xyz.aspx,
www.abc.com/es/xyz.aspx

谢谢

我不知道您在这里要问什么,但是如果您需要特定Sitecore项目的语言嵌入URL,您只需要为链接提供程序配置
languageEmbedding=“always”
,然后使用LinkManager请求项目的URL:

Sitecore.Links.LinkManager.GetItemUrl(item);
如果需要特定语言的URL或在代码中显式设置
languageEmbedding
选项,可以在
urlpoptions
中设置:

var options = Sitecore.Links.LinkManager.GetDefaultUrlOptions();
options.LanguageEmbedding = Sitecore.Links.LanguageEmbedding.Always;
options.EmbedLanguage(Sitecore.Globalization.Language.Parse("en"));

Sitecore.Links.LinkManager.GetItemUrl(item, options);

希望有帮助

您是如何处理旧网站中的语言的?您如何知道用户正在请求EN/FR/ES中的页面

由于您使用的是来自旧站点的301重定向,因此需要处理从旧站点嵌入到URL中的语言。从Sitecore端处理它只会给你一个“更漂亮”的URL,还有一个缺点,那就是在你检查重定向是否嵌入了语言后,必须再添加一个302重定向到同一页面。路德建议使用IIS重写是一个很好的建议

所以当我们从旧网站重定向到新网站进行301重定向时 在谷歌,如果我用法语打开我的新网站并重定向 来自旧网站是英文的(这意味着在url中没有 语言,即“en”)链接将指向法语版本)

是的,Sitecore就是这样工作的,它使用cookies来持久化最后选择的语言,但是上下文语言是按以下顺序设置的。您的首次访问将设置语言cookie

  • sc_lang查询字符串参数
  • 请求的URL中路径中的语言前缀
  • 与上下文站点关联的语言cookie
  • 与上下文逻辑站点关联的默认语言
  • 在web.config中指定的DefaultLanguage设置
  • 如果确实不希望在浏览器会话之间保留该语言,请使用自己的逻辑覆盖
    Sitecore.Pipelines.HttpRequest.LanguageResolver
    管道,使其要么不设置cookie(在这种情况下,您完全依赖于请求URL),要么设置浏览器关闭时将过期的cookie。你可以在之前链接的John West博客文章中找到一个例子,也可以从中找到一个例子

    如果您唯一关心的是谷歌索引,那么我可能不会做任何更改,除了在您的页面上添加一个包含完整URL(包括语言)的插件(对于每个语言版本,这显然是不同的)


    看看Sitecore.Pipelines.Preprerequest.StripLanguage。。。
    我会覆盖这一个,如果使用现有函数找不到任何语言,我会默认返回到en。

    您可以为此使用URLPOPTIONS,请参见下面的代码-

    protected UrlOptions URLOptions
            {
                get
                {
                    if (urlOptions == null)
                    {
                        urlOptions = new UrlOptions()
                        {
                            LanguageEmbedding = LanguageEmbedding.Always,
                            AddAspxExtension = false
                        };
                    }
                    return urlOptions;
    
                }
            }
    
    请在geturl()函数中传递此URloption对象,它将起作用


    LinkManager.GetItemUrl(itm,URLOptions)

    您可以通过sitecore设置实现此功能


    请参考以上截图。将languageEmbedding属性更改为always from asNeeded此设置在Sitecore.config文件中完成。请让我知道这是否有助于满足您的要求。

    没有办法实现您想要的开箱即用,您唯一能做的就是检查请求URL是否包含该语言,如果不包含该语言,则302重定向回包含该语言的自身(但您现在有3个跃点才能访问内容)。您可以建议任何自定义条件来构建此应用程序吗?您可以为此使用IIS URL重写功能。然后定义一个模式,将所有请求(如/*.asp)重定向到新URL,如/en/*.aspx。只有路径完全相同且新站点中存在所有旧路径时,这才有效。考虑到额外的信息,Ruud建议的IIS URL重写模块是实现这一点的最简单方法。您可以尝试以下方法:如果不想使用IIS重写,旧网站是静态经典asp站点。那么用文件系统语言是谁选择的文件系统语言,用户浏览网站?如果用户访问该网站并希望使用不同的语言浏览,他们无法做到这一点,该怎么办?是的,他们可以做到,我们在网站上有法语和西班牙语的切换按钮,该按钮指向特定的语言。在EN/FR/ES中,旧网站页面的URL是什么?给我们一个所有语言的例子,以及如何映射到新语言(将其添加到原始问题中)我想做相反的事情,关闭语言嵌入以用于breadcrumbd,@Ruud为我指出了正确的方向,最后使用var options=new urlpoptions{LanguageEmbedding=LanguageEmbedding.Never};