4

我正在为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对象上。

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

4

2 回答 2

5

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

于 2012-08-01T13:06:15.103 回答
2

这不是一个直接的答案,但它可能仍然有用,因为 Sitecore 在做(我认为)您想要实现的目标时会加入一些技巧。

从记忆里...

当(且仅当)链接管理器设置为 LanguageEmbedding 'always' 或 'asNeeded' 时,URL 的语言部分会被剥离语言管道处理器移除。如果将其设置为“从不”,则对 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 进行比较。

我认为您可以将链接管理器返回的 Url 字符串解析为 Uri 对象并比较那里的路径。当提供一个完全限定的 URL 时,它似乎表现得更好,所以也许修改从 GetDefaultOptions() 返回的 UrlOptions 以提供一个。

保罗

于 2012-08-01T22:25:38.097 回答