我们在旧的经典asp网站(也是3种语言)中创建了FR,ES,EN的多语言网站。默认情况下,在旧网站中,英语“en”未嵌入URL中。但在我们新的sitecore网站上,我有语言Embedding =“Always”。
因此,当我们从旧网站重定向到新网站以获取Google中的301重定向时,如果我用法语打开我的新网站并且从旧网站重定向是英文(这意味着在网址中没有语言,即“en” “)链接将指向法语版本。)
那我怎么能在网址上添加“en”。
HttpContext.Current.Request.RawUrl
我可以使用上面的方法来获取原始网址,但我没有得到如何在浏览器网址中显示“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
感谢
答案 0 :(得分:2)
您是如何处理旧网站中的语言的?您是如何知道用户在EN / FR / ES中请求页面的?
由于您要从旧网站重定向301,因此您需要将语言嵌入到旧网站的网址中。从Sitecore方面处理它将最好只给你一个“更漂亮”的URL,在你检查重定向后是否必须添加另一个302重定向到同一页面的附加缺点是嵌入了或不是。 Ruud建议使用IIS Rewrite是一个很好的建议。
因此,当我们从旧网站重定向到新网站进行301重定向时 在谷歌,如果我用法语打开我的新网站并重定向 来自旧网站的是英文(这意味着在网址中没有 语言,即“en”)链接将指向法语版本。)
是的,这就是Sitecore的工作方式,它使用cookie来保留最后选择的语言,但上下文语言按以下顺序设置。您的初次访问将设置语言cookie。
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并使用包含语言的完整网址(对于每种语言版本,这显然会有所不同)。< / p>
<link rel="canonical" href="http://www.abc.com/en/xyz.aspx"/>
答案 1 :(得分:1)
我不确切地知道您在这里问的是什么,但是如果您需要为特定Sitecore项目添加语言嵌入的URL,您只需要为链接提供程序配置languageEmbedding="always"
,然后请求该项目的URL使用LinkManager:
Sitecore.Links.LinkManager.GetItemUrl(item);
如果您需要特定语言的网址或在代码中明确设置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);
希望有所帮助!
答案 2 :(得分:0)
查看Sitecore.Pipelines.PreprocessRequest.StripLanguage ... 我会覆盖这个,如果没有找到使用现有函数的语言,我会默认回到en。
答案 3 :(得分:0)
您可以使用URLOptions,请参阅下面的代码 -
protected UrlOptions URLOptions
{
get
{
if (urlOptions == null)
{
urlOptions = new UrlOptions()
{
LanguageEmbedding = LanguageEmbedding.Always,
AddAspxExtension = false
};
}
return urlOptions;
}
}
请在geturl()函数中传递此URloption对象,它将起作用。
LinkManager.GetItemUrl(itm,URLOptions)
答案 4 :(得分:0)