Переписать параметры URL в Sitecore

У меня есть сайт, который показывает архив новостей на основе параметра «год» в URL-адресе. Например: domain.com/news/newsarchive?year=2008.

Как я могу в Sitecore CMS переписать свои URL-адреса, чтобы удалить параметр «год»? Я хочу переписать свои URL примерно так: domain.com/news/newsarchive/2008

Как это возможно в Sitecore?


person Kim Andersen    schedule 09.05.2011    source источник


Ответы (6)


Это зависит от вашего решения. URL-адрес по умолчанию является индикатором того, какой элемент разрешен. Это означает, что URL-адрес /news/newsarchive/2008 обычно разрешает элемент в вашем дереве контента с этим путем.

Поэтому у вас есть несколько вариантов.

  1. Сделайте свое дерево содержимого похожим на нужный URL-адрес. Так что перемещайте свои новости так, чтобы все новости, созданные в 2008 году, находились в папке 2008 года. В папке 2008 года будет презентация, показывающая архив, в частности, за этот год.

  2. Переопределите способ разрешения вашего элемента контекста. Насколько я помню, это делается в конвейере httpBeginRequest в обработчике ItemResolver.

  3. Используйте подстановочный знак, как предлагает Ян, и у вас есть собственный код, чтобы получить год из вашего URL-адреса.

надеюсь, это поможет

person Jens Mikkelsen    schedule 10.05.2011

Просто чтобы добавить к 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;
            }
        }
    }
}

И добавьте это в HttpRequestPipeline после ItemResolver

<pipelines>
  <httpRequestBegin>
    <processor patch:after="*[@type='Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel']" type="yourNameSpace.CustomResolver,  yourNameSpace" />
  </httpRequestBegin>
</pipelines>

This is about the same way, Sitecore uses in Sitecore Ecommerce Services(SES) to resolve products.

person Sandbeck    schedule 08.05.2012

Вы можете использовать подстановочный знак подход.

person CGiddings    schedule 10.05.2011
comment
Предоставление информации о решении, а не просто размещение ссылки, повысит полезность вашего ответа. - person this.josh; 11.05.2011

Вы можете сделать именно это сейчас со следующим модулем с открытым исходным кодом, написанным Sitecore MVC Stephen Pope:

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

person Steve Newstead    schedule 21.11.2011

Добавление к возможным решениям: модуль isapi_rewrite на уровне IIS.

Например. Модуль от helicontech может обрабатывать довольно сложные перезаписи http://www.helicontech.com/isapi_rewrite/doc/examples.htm

Это было бы правильным решением, если бы причиной перенаправления была обработка URL-адресов, нацеленных на более раннюю структуру веб-сайта. Это избавит реализацию sitecore от «устаревших» ссылок.

person Jan Hebnes    schedule 11.05.2012

Лучший подход для этого, как сказал Йенс Миккельсен, 1) сделать структуру вашего содержимого похожей на предпочтительную структуру URL-адреса. и если это невозможно 2) использовать подстановочный элемент (элемент с * в качестве имени) в качестве дочернего элемента элемента архива новостей. Этот элемент обрабатывает все дочерние элементы ниже элемента архива новостей, которые не могут быть найдены в дереве. В отделенном коде подмакета вы можете прочитать путь к запрошенному элементу и обработать свой код в соответствии с ним.

person Martijn van der Put    schedule 18.09.2012