2015-06-22 7 views
2

Клиент запросил, чтобы все ссылки на внешние страницы в нашем решении sitecore должны были иметь атрибут nofollow. Какой трубопровод я должен использовать для доступа к html ответа (чтобы изменить ссылки до того, как они будут доставлены с разметкой в ​​браузер)? Или есть ли лучшее решение для этого?Добавить атрибут nofollow для каждого <a> тег с внешней ссылкой после того, как страница была отображена

JavaScript здесь не очень полезен, потому что я не уверен, что все поисковые системы могут запускать JavaScript.

RenderField процессор также не могут быть использованы из-за многих пользовательских тегов в коде

+4

не ответ, но ваш клиент имеет ни малейшего представления, что они» спрашивать? Я предполагаю, что у них создается впечатление, что, пока поисковая система сканирует ваш сайт, она может выпрыгнуть и вместо этого выполнить обход кого-то другого. Это было бы неправильно. Я бы спросил, что это за бизнес. –

+3

В дополнение к @JamesWalford - несколько лет назад это была обычная практика профессионалов SEO, чтобы рекомендовать это, чтобы предотвратить утечку Google PageRank на внешние сайты. Любая польза, которая могла бы (может быть!) Почерпнута из этого, уже давно исчезла. См. [Wikipedia/NoFollow] (https://en.wikipedia.org/wiki/Nofollow) –

ответ

2

Вы можете использовать Sitecore.Pipelines.HttpRequest и патч после ExecuteRequest.

С этой точки зрения у вас есть полностью отображенный html, включая все кешированные компоненты из кэша HTML.

Редактировать добавить пример:

#region Using 
using System; 
using System.IO; 

using Sitecore.Pipelines.HttpRequest; 

#endregion 

namespace MySpace.Sitecore.Pipelines 
{ 

    public class MyProcessor : HttpRequestProcessor 
    { 

     public override void Process(HttpRequestArgs args) 
     { 

      if (!global::Sitecore.Context.PageMode.IsPageEditor) 
      { 
       if (!args.Context.Request.RawUrl.Contains(".") || (args.Context.Request.RawUrl.ToLower().Contains(".aspx") && !args.Context.Request.RawUrl.ToLower().StartsWith("/sitecore"))) 
       { 
        args.Context.Response.Filter = new MyInterestFilter(args.Context.Response.Filter); 
       } 
      } 
     } 

     #region Stream filter 

     public class MyInterestFilter : Stream 
     { 

      public MyInterestFilter(Stream sink) 
      { 
       _sink = sink; 
      } 

      private Stream _sink; 

      #region Properites 

      public override bool CanRead 
      { 
       get { return true; } 
      } 

      public override bool CanSeek 
      { 
       get { return true; } 
      } 

      public override bool CanWrite 
      { 
       get { return true; } 
      } 

      public override void Flush() 
      { 
       _sink.Flush(); 
      } 

      public override long Length 
      { 
       get { return 0; } 
      } 

      private long _position; 

      public override long Position 
      { 
       get { return _position; } 
       set { _position = value; } 
      } 

      #endregion 

      #region Methods 

      public override int Read(byte[] buffer, int offset, int count) 
      { 
       return _sink.Read(buffer, offset, count); 
      } 

      public override long Seek(long offset, SeekOrigin origin) 
      { 
       return _sink.Seek(offset, origin); 
      } 

      public override void SetLength(long value) 
      { 
       _sink.SetLength(value); 
      } 

      public override void Close() 
      { 
       _sink.Close(); 
      } 

      public override void Write(byte[] buffer, int offset, int count) 
      { 
       byte[] data = new byte[count]; 
       Buffer.BlockCopy(buffer, offset, data, 0, count); 
       string html = System.Text.Encoding.Default.GetString(buffer); 

       html = MyReplace(html); 

       byte[] outdata = System.Text.Encoding.Default.GetBytes(html); 
       _sink.Write(outdata, 0, outdata.GetLength(0)); 
      } 

      public static string MyReplace(string html) 
      { 

       html = html.Replace("TESTSTRING", "REPLACEDTESTSTRING"); 

       return html; 
      } 

      #endregion 

     } 

     #endregion 

    } 
} 

и установить файл заплатки в App_Config включают каталог Somethings, как это:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> 
    <sitecore> 
    <pipelines> 
     <httpRequestBegin> 
     <processor type="MySpace.Sitecore.Pipelines.MyProcessor, MySpace.Sitecore" patch:after="processor[@type='Sitecore.Pipelines.HttpRequest.ExecuteRequest, Sitecore.Kernel']"/> 
     </httpRequestBegin> 
    </pipelines> 
    </sitecore> 
</configuration> 
+0

Как я могу получить доступ и изменить HTML-код в процессоре? Использование HttpRequestArgs? Ответ на запрос? – Igor

+0

... Думаю, я поймал что :. Мне нужно использовать фильтр HttpResponse (я прав?) – Igor

+0

Да, подобно HttpModule, но теперь в конвейере Sitecore. Я добавляю пример, работает для webForms, и я также думаю, что для MVC альтернатива - это HttpModule. –

 Смежные вопросы

  • Нет связанных вопросов^_^