在Sitecore中重写URL参数

时间:2011-05-09 14:05:31

标签: .net parameters url-rewriting sitecore

我有一个网站,根据网址中的“年”参数显示新闻档案。一个例子可能是这样的: 的 domain.com/news/newsarchive?year=2008

如何在Sitecore CMS中重写我的网址以删除“年”参数?我想将我的URL重写为以下内容: 的 domain.com/news/newsarchive/2008

Sitecore如何实现这一目标?

6 个答案:

答案 0 :(得分:3)

这取决于你的解决方案。默认情况下,URL是指示解决了哪个项目。这意味着URL / news / newsarchive / 2008通常会使用该路径解析内容树中的项目。

因此您有几种选择。

  1. 使您的内容树类似于您想要的网址。所以移动你的新闻,以便2008年创建的所有新闻都在2008年的文件夹下。然后,2008文件夹将有一个演示文稿,特别显示该年份的存档。

  2. 覆盖解析上下文项的方式。这是在我记得的处理器ItemResolver中的httpBeginRequest管道中完成的。

  3. 使用Yan建议的通配符,并使用一些自定义代码从您的网址获取年份。

  4. 希望有所帮助

答案 1 :(得分:2)

在他的回复中加入Jens Mikkelsen第二点。

制作你自己的HttpRequestProcessor:

public class CustomResolver : HttpRequestProcessor
{
    public override void Process(HttpRequestArgs args)
    {
        Assert.ArgumentNotNull(args, "args");
        //make sure you are in the right context, and that the pipeline hasn't resolved an item yet
        if ((Sitecore.Context.Item == null && Sitecore.Context.Database != null) 
            && (Sitecore.Context.Database.Name != "core") )
        {
            var requestUrl = args.Context.Request.RawUrl; // e.g. domain.com/news/newsarchive/2008
            //Do your magic here
            Item item = ResolveItemOnUrl(requestUrl);
            if (item != null)
            {
                Sitecore.Context.Item = item;
            }
        }
    }
}

并在ItemResolver

之后将其添加到HttpRequestPipeline
<pipelines>
  <httpRequestBegin>
    <processor patch:after="*[@type='Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel']" type="yourNameSpace.CustomResolver,  yourNameSpace" />
  </httpRequestBegin>
</pipelines>

这与Sitecore在Sitecore电子商务服务(SES)中用于解析产品的方式大致相同。

答案 2 :(得分:0)

您可以使用the Wildcard approach

答案 3 :(得分:0)

您现在可以使用Sitecore MVC Stephen Pope编写的以下开源模块完成此操作:

https://github.com/Sitecore/Sitecore-Mvc-Routing

答案 4 :(得分:0)

添加潜在的解决方案:IIS级别的isapi_rewrite模块。

E.g。来自helicontech的模块可以处理相当复杂的重写 http://www.helicontech.com/isapi_rewrite/doc/examples.htm

如果重定向的原因是处理针对早期网站结构的网址,那么这将是正确的解决方案。这将使sitecore实现免于“遗留”引用。

答案 5 :(得分:0)

最好的方法就像Jens Mikkelsen所说 1)使contenttree的结构类似于首选的url结构。 如果这是不可能的 2)使用通配符项(名称为*的项目)作为newsarchive-item的子项目。此项处理无法在树中找到的newsarchive项下面的所有子项。在子布局的代码隐藏中,您可以读取所请求项目的路径并根据该处理代码。