我在管理网站面板
中进行了以下设置常规网址设置为 alloy.com
为否文化设置alloy.no
为 sv 文化设置alloy.se
为 en 文化设置了alloy.com
在我的代码中,我希望为给定页面获取给定语言的友好外部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 网页并在我的自定义代码中生成友好网址,这很简单。
但是当我使用 alloy.no 进入编辑模式时,我会尝试生成没有的地址我得到合金。 com /søk应该是合金。否 /søk。
我发现如果我使用 alloy.no 转到编辑模式,请输入代码:
urlResolver.GetUrl(reference, language)
仅返回 /søk 和代码
UriSupport.AbsoluteUrlBySettings(builder.ToString())
添加常规网址(alloy.com)而不是alloy.no。
如何改进此代码,为不同文化中的页面获取正确的主机名?
答案 0 :(得分:4)
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。但在这种情况下,我选择直接使用它来保持示例更加包含。
答案 1 :(得分:2)
我们有一个支持案例。我们希望url解析器在请求规范URL时始终返回绝对URL。这是我们目前的解决方案:
<input name="note" size="100" value="<? echo $note; ?>"></input>
答案 2 :(得分:1)
在编写在多语言,多主机名网站上运行的预定作业时,我也遇到了此问题。为了在没有HttpContext的情况下获得具有正确主机名的绝对URL,我必须将Henrik的代码与Dejan的代码结合起来:https://www.dcaric.com/blog/episerver-how-to-get-external-page-url。
这就是我提出的:
public static string ExternalUrl(this ContentReference contentLink, CultureInfo language)
{
var urlString = UrlResolver.Current.GetUrl(contentLink, language.Name, new VirtualPathArguments { ForceCanonical = true });
var uri = new Uri(urlString, UriKind.RelativeOrAbsolute);
if (uri.IsAbsoluteUri) return urlString;
string externalUrl = HttpContext.Current == null
? UriSupport.AbsoluteUrlBySettings(urlString)
: HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + urlString;
return externalUrl;
}
答案 3 :(得分:0)
public static string GetExternalAbsoluteFriendlyUrl(
this ContentReference reference,
string language)
{
var urlResolver = ServiceLocator.Current.GetInstance<UrlResolver>();
var friendlyUrl = urlResolver.GetUrl(reference, language);
if (string.IsNullOrEmpty(friendlyUrl))
return friendlyUrl;
var uri = new Uri(friendlyUrl, UriKind.RelativeOrAbsolute);
if (uri.IsAbsoluteUri)
return friendlyUrl;
if (HttpContext.Current != null)
return new Uri(HttpContext.Current.Request.Url, uri).ToString();
var siteDefinitionResolver =
ServiceLocator.Current.GetInstance<SiteDefinitionResolver>();
var siteDefinition =
siteDefinitionResolver.GetDefinitionForContent(reference, true, true);
return new Uri(siteDefinition.SiteUrl, friendlyUrl).ToString();
}