【问题标题】:Language embedding in Sitecore URLSitecore URL 中嵌入的语言
【发布时间】:2014-02-01 07:33:49
【问题描述】:

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

因此,当我们从旧网站重定向到新网站以在 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

谢谢

【问题讨论】:

  • 没有办法实现你想要的开箱即用,你唯一能做的就是检查请求 URL 是否包含语言,如果不包含则 302 重定向使用包含的语言回到自身(但您现在有 3 次跳转才能访问内容)。
  • 你能建议任何自定义标准来构建这个
  • 您可以为此使用 IIS URL 重写功能。然后定义一个模式,将所有请求(例如 /*.asp)重定向到新的 URL,例如 /en/*.aspx。仅当路径完全相同并且所有旧路径都存在于新站点中时才有效。
  • 鉴于额外的信息,Ruud 对 IIS URL Rewrite 模块的建议是实现这一目标的最简单方法
  • 如果你不想使用 IIS Rewrite,你可以试试这个:stackoverflow.com/a/21136149/661447

标签: sitecore sitecore7


【解决方案1】:

我不知道你在这里问什么,但如果你需要为特定 Sitecore 项目嵌入语言的 URL,你只需为链接提供者配置 languageEmbedding="always",然后使用链接管理器:

Sitecore.Links.LinkManager.GetItemUrl(item);

如果您需要特定语言的 URL 或在代码中明确设置 languageEmbedding 选项,您可以在 UrlOptions 中设置:

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

希望有帮助!

【讨论】:

  • 我想做相反的事情,关闭语言嵌入以在面包屑中使用,@Ruud 为我指出了正确的方向,最终使用 var options = new UrlOptions { LanguageEmbedding = LanguageEmbedding.Never };
【解决方案2】:

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

由于您使用旧网站的 301 重定向,您需要处理嵌入旧网站 URL 中的语言。从 Sitecore 端处理它只会给你一个“更漂亮”的 URL,另外一个缺点是在你检查了重定向是否嵌入了语言之后,必须添加另一个 302 重定向到同一页面。 Ruud 建议使用 IIS Rewrite 是一个很好的建议。

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

是的,这就是 Sitecore 的工作方式,它使用 cookie 来保存最后选择的语言,但上下文语言按以下顺序设置。您的初次访问会设置语言 cookie。

  1. sc_lang 查询字符串参数。
  2. 请求的 URL 路径中的语言前缀。
  3. 与上下文站点关联的语言 cookie。
  4. 与上下文逻辑站点关联的默认语言。
  5. 在 web.config 中指定的 DefaultLanguage 设置。

Overriding Sitecore’s Logic to Determine the Context Language

如果您真的不希望语言在浏览器会话之间持续存在,请使用您自己的逻辑覆盖 Sitecore.Pipelines.HttpRequest.LanguageResolver 管道,以不设置 cookie(在这种情况下您完全依赖请求 URL)或设置 cookie浏览器关闭时将过期。您可以在 this blog post 中找到一个示例,也可以在之前链接的 John West 博客文章中找到一个示例。

如果您唯一关心的是 Google 索引,那么我可能不会做任何更改,除了在您的页面上添加一个 canonical link tags 并带有包含语言的完整 URL(这对于每个语言版本显然会有所不同)。

<link rel="canonical" href="http://www.abc.com/en/xyz.aspx"/>

【讨论】:

  • 旧网站是静态经典asp网站。所以选择了文件系统语言
  • 文件系统语言是谁,浏览网站的用户?如果用户访问该网站并希望以其他语言浏览,但他们无法做到这一点怎么办?
  • 是的,他们可以,我们在网站上有切换按钮,使用法语和西班牙语,可以切换到特定语言
  • 旧网站页面在 EN/FR/ES 中的 URL 是什么?给我们一个所有语言的例子,以及一种语言如何映射到新语言(将其添加到您的原始问题中)
【解决方案3】:

看看 Sitecore.Pipelines.PreprocessRequest.StripLanguage... 我会覆盖这个,如果使用现有函数没有找到语言,我会默认回到 en。

【讨论】:

    【解决方案4】:

    您可以为此使用 URLOptions 请参阅下面的代码 -

    protected UrlOptions URLOptions
            {
                get
                {
                    if (urlOptions == null)
                    {
                        urlOptions = new UrlOptions()
                        {
                            LanguageEmbedding = LanguageEmbedding.Always,
                            AddAspxExtension = false
                        };
                    }
                    return urlOptions;
    
                }
            }
    

    请在 geturl() 函数中传递这个 URloption 对象,它将起作用。

    LinkManager.GetItemUrl(itm, URLOptions)

    【讨论】:

      【解决方案5】:

      您可以通过站点核心设置来实现此功能。

      请参考上面的截图。将 languageEmbedding 属性从 asNeeded 更改为 always 此设置在 Sitecore.config 文件中完成。如果这有助于您满足您的要求,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多