在Sitecore中检索URL路径部分的方法是什么?

时间:2012-08-01 12:53:41

标签: asp.net sitecore sitecore6

我正在编写HTTPRequest管道的扩展程序,以重定向传入的请求,其中Sitecore可以找到正确的项目,但请求的URL不是由Sitecore形成的完全形成的。这是为了防止SEO重复内容问题。

我要检查的URL部分是符合LinkManager.GetItemUrl(context.item)结果的部分。在我们的例子中,我们在路径中嵌入了语言,例如:

www.mysite.com/en-gb/stuff/things

所以GetItemUrl返回/en-gb/stuff/things

我无法在Sitecore.Pipelines.HttpRequest.HttpRequestArgs对象上找到正确的方法,也无法在System.Web.HttpContext.Current.Request.Url对象上找到正确的方法。

我可以获取整个网址或路径减去语言嵌入。哪个object.method会给我/en-gb/stuff/things

2 个答案:

答案 0 :(得分:5)

我不确定我是否理解正确但似乎你正在寻找的是System.Web.HttpContext.Current.Request.RawUrl。如果没有,请详细说明您想要实现的目标。

答案 1 :(得分:2)

这不是一个直接的答案,但它可能是有用的,因为Sitecore在执行(我认为)你想要实现的目标时会抛出一些技巧。

从记忆......

如果(并且仅当)linkmanager设置为LanguageEmbedding'always'或'asNeeded',则条带语言管道处理器将删除URL的语言部分。如果它被设置为'never',如果对HttpRequest中的url没有任何作用。如果将剥离路径与LinkManager的前缀路径进行比较,这可能会使路径比较混乱。

您可以在 stripLanguage步骤之前添加管道步骤,该步骤会根据您的需要将传入的URL添加到HttpRequest中的字典中。

public class StoreOriginalRequestUrl : PreprocessRequestProcessor
{
    public override void Process(PreprocessRequestArgs args)
    {
        args.Context.Items["OriginalRequestUrl"] = args.Context.Request.RawUrl;
    }
}

...然后你可以在项目解析器之后的后续步骤中选择它。我假设这正是你正在做的事情 - 将请求URL与Linkmanager的上下文项目的URL进行比较。

我认为你可以解析linkmanager返回的Url字符串作为Uri对象并比较那里的路径。在提供完全限定的URL时似乎表现得更好,因此可能修改从GetDefaultOptions()返回的UrlOptions以提供一个。