我们在旧的经典asp网站(也是3种语言)中创建了FR,ES,EN的多语言网站。默认情况下,在旧网站中,英语“en”未嵌入URL中。但在我们新的sitecore网站上,我有语言嵌入=“总是”。
因此,当我们从旧网站重定向到新网站进行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
谢谢
你是如何处理旧网站的语言的?您是如何知道用户在EN / FR / ES中请求页面的?
由于您使用旧网站上的301重定向,因此您需要将语言嵌入到旧网站的URL中。从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并使用包含语言的完整网址(对于每种语言版本,这显然会有所不同)。
<link rel="canonical" href="http://www.abc.com/en/xyz.aspx"/>
我不确切地知道你在这里问的是什么,但是如果你需要为特定Sitecore项目添加语言嵌入的URL,你只需要为链接提供者配置languageEmbedding="always"
,然后使用LinkManager请求项目的URL:
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);
希望有所帮助!
看一下Sitecore.Pipelines.PreprocessRequest.StripLanguage ...我会覆盖这个,如果没有找到使用现有函数的语言,我会默认回en。
您可以使用URLOptions,请参阅下面的代码 -
protected UrlOptions URLOptions
{
get
{
if (urlOptions == null)
{
urlOptions = new UrlOptions()
{
LanguageEmbedding = LanguageEmbedding.Always,
AddAspxExtension = false
};
}
return urlOptions;
}
}
请在geturl()函数中传递此URloption对象,它将起作用。
LinkManager.GetItemUrl(itm,URLOptions)