我正在编写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
?
答案 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以提供一个。
保