Sitecore редирект на ошибки

Я знаю что могу продлить Sitecore.Pipelines.HttpRequest.ExecuteRequest и переопределить методы, такие как RedirectOnItemNotFound перенаправить на мою пользовательскую страницу 404 и т. д. Мне было интересно, есть ли способ перенаправить на пользовательскую страницу (которая будет находиться в sitecore) для всех ошибок, кроме 404 и 500?

E сть RedirectOnNoAccess метод для ошибки 403, я думаю, но я ищу способ перенаправления на все ошибки, такие как 400, 401, 403, 405 и т. д.

Sitecore v7.2

ура

2 ответа

Решение

Вам не нужно расширять ExecuteRequest Процессор, есть настройки в разделе Sitecore конфигурации для обработки этих:

<!--  ITEM NOT FOUND HANDLER
        Url of page handling 'Item not found' errors
  -->
<setting name="ItemNotFoundUrl" value="/sitecore/service/notfound.aspx"/>

<!--  LINK ITEM NOT FOUND HANDLER
        Url of page handling 'Link item not found' errors
  -->
<setting name="LinkItemNotFoundUrl" value="/sitecore/service/notfound.aspx"/>

<!--  LAYOUT NOT FOUND HANDLER
        Url of page handling 'Layout not found' errors
  -->
<setting name="LayoutNotFoundUrl" value="/sitecore/service/nolayout.aspx"/>

<!--  ACCESS DENIED HANDLER
        Url of page handling 'Acess denied' errors
  -->
<setting name="NoAccessUrl" value="/sitecore/service/noaccess.aspx"/>

Обновите эти значения, чтобы они указывали на правильный путь. Это может быть путь элемента Sitecore, например /errors/404, если этот элемент существует в Sitecore. Немного раздражает, что к пути добавляется параметр url, хотя вам нужно будет расширить процессор, если вы хотите избавиться от этого. Если у вас есть многосайтовая реализация, это все равно будет работать, но вам нужно убедиться, что структура одинакова для всех сайтов, так как вы используете относительный путь. Модуль диспетчера ошибок, по сути, является оберткой для этих же настроек, но лучше в том, что он способен обрабатывать несколько сайтов и отображает страницу с ошибками, не выполняя перенаправление 302.

Если вам нужно обработать другие ошибки, то воспользуйтесь разделом ошибок в конфигурации для их определения. Значения также могут быть установлены через IIS (хотя он все равно обновляет web.config)

<system.webServer>
  <httpErrors errorMode="DetailedLocalOnly" defaultResponseMode="ExecuteURL" defaultPath="/errors/404">
    <remove statusCode="404" subStatusCode="-1" />
    <remove statusCode="405" subStatusCode="-1" />
    <remove statusCode="500" subStatusCode="-1" />
    <error statusCode="404" prefixLanguageFilePath="" path="/errors/404" responseMode="ExecuteURL" />
    <error statusCode="405" prefixLanguageFilePath="" path="/errors/405" responseMode="ExecuteURL" />
    <error statusCode="500" prefixLanguageFilePath="" path="/errors/static/500.html" responseMode="ExecuteURL" />
  </httpErrors>
</system.webServer>

Они могут быть в Sitecore путем установки URL-пути элемента или статических HTML-файлов на диске, и снова это работает в многосайтовом режиме, если структура одинакова для всех сайтов, поскольку путь может быть относительным. Обычно рекомендуется, чтобы страница 500 была статической HTML-страницей, в противном случае существует вероятность бесконечного цикла (например, база данных выключается, показывает 500, извлекает контент из Sitecore, но база данных не работает...).

Даже если вы используете модуль Error Manager или используете настройки Sitecore, я рекомендую, чтобы в конфигурации были определены страницы 404 и 500. По умолчанию Sitecore будет обрабатывать только динамические и растягивающиеся URL-запросы, поэтому, если запрос сделан для /file.txt, /style.css, /script.js или же /document.pdf тогда вы получите стандартную страницу ошибок IIS.

<preprocessRequest>
  <processor type="Sitecore.Pipelines.PreprocessRequest.FilterUrlExtensions, Sitecore.Kernel">
    <param desc="Allowed extensions (comma separated)">aspx, ashx, asmx</param>
    <param desc="Blocked extensions (comma separated)">*</param>
    <param desc="Blocked extensions that stream files (comma separated)">*</param>
    <param desc="Blocked extensions that do not stream files (comma separated)"></param>
  </processor>
</preprocessRequest>

Вы могли бы разрешить всем запросам проходить через Sitecore, но это кажется немного сложным, и вы выполняете его через дополнительные конвейеры. Установка выше будет означать, что ваш статический контент также корректно обрабатывается.

Определенно можно использовать конвейер запросов на выполнение для обработки ошибок 403 и 401, так как этот конвейер вызывается достаточно рано.

На рынке уже есть отличный модуль, который вы можете адаптировать к вашим потребностям.

https://marketplace.sitecore.net/en/Modules/Sitecore_Error_Manager.aspx

http://ctor.io/handling-404-and-other-errors-with-sitecore-items/

Другие вопросы по тегам