当前位置 : 主页 > 网页制作 > HTTP/TCP >

EpiServer – 为页面的特定文化获取绝对友好的URL

来源:互联网 收集:自由互联 发布时间:2021-06-16
我在“管理网站”面板中进行了以下设置 General Url is set to alloy.com alloy.no is set for no culture alloy.se is set for sv culture alloy.com is set for en culture 在我的代码中,我想获得给定页面的给定语言的
我在“管理网站”面板中进行了以下设置

General Url is set to alloy.com

alloy.no is set for no culture

alloy.se is set for sv culture

alloy.com is set for en culture

在我的代码中,我想获得给定页面的给定语言的友好外部URL.
因此,对于搜索页面,我希望获得所有语言的绝对友好网址.

我使用以下代码获取页面的友好URL(在Anders G. Nordby blog上找到):

var urlResolver = ServiceLocator.Current.GetInstance<UrlResolver>();
var pageAddress = urlResolver.GetUrl(reference, language);

var builder = new UrlBuilder(pageAddress);

Global.UrlRewriteProvider.ConvertToExternal(builder, null, Encoding.UTF8);

var friendlyUrl = builder.Uri.IsAbsoluteUri
    ? builder.ToString()
    : UriSupport.AbsoluteUrlBySettings(builder.ToString());

return friendlyUrl;

如果我将使用alloy.com网页并在我的自定义代码中生成友好的URL,这很简单.

> no – alloy.no/søk
> se – alloy.se/sök
> en – alloy.com/search

但是当我使用alloy.no进入编辑模式时,我会尝试生成地址,因为它应该是alloy.no/søk,而不是我得到alloy.com/søk.

我发现如果我使用alloy.no进入编辑模式,代码:

urlResolver.GetUrl(reference, language)

仅返回/søk和代码

UriSupport.AbsoluteUrlBySettings(builder.ToString())

添加常规URL(alloy.com)而不是alloy.no.

如何改进此代码以在不同文化中为页面获取正确的主机名?

UrlResolver的GetUrl方法将根据当前请求上下文将URL返回到相对或绝对的页面.如果页面位于当前站点中,则URL将是相对的;如果在另一个站点中,则URL是绝对的,或者如果在请求之外进行调用,则URL将是相对的.

如果您使用的是EPiServer.CMS.Core 8.0或更高版本,则还支持将一个站点标识为主站点.此更新还可以通过在VirtualPathArguments参数上设置ForceCanonical标志,明确请求URL应该是主站点.如果没有设置标志,它将优先选择主节点上的当前站点URL(假设请求的内容位于当前站点上).

因此,考虑到这一点,您可以假设返回的URL(如果不是绝对的话)将相对于当前请求的站点并安全地将其与当前请求的URL组合,例如:

private static string ExternalUrl(this ContentReference contentLink, CultureInfo language)
{
    var urlString = UrlResolver.Current.GetUrl(contentLink, language.Name, new VirtualPathArguments { ForceCanonical = true });
    if (string.IsNullOrEmpty(urlString) || HttpContext.Current == null) return urlString;

    var uri = new Uri(urlString, UriKind.RelativeOrAbsolute);
    if (uri.IsAbsoluteUri) return urlString;

    return new Uri(HttpContext.Current.Request.Url, uri).ToString();
}

在大多数情况下,我可能不希望直接使用HttpContext.Current,而是传入当前请求URL.但在这种情况下,我选择直接使用它来保持示例更加包含.

网友评论