Назад | Перейти на главную страницу

Настройка разных страниц статических ошибок в IIS для разных доменов

У меня есть один веб-сайт IIS, на котором будет размещено несколько сайтов (с использованием CMS). У каждого сайта есть свой домен и своя тема, поэтому я хочу, чтобы страницы ошибок (404 и 500) были специфичными для каждого сайта.

Обычно я бы настраивал страницы ошибок, используя httpErrors в web.config, но я думаю, что это работает только для одного набора страниц с ошибками?

Идея, которая возникла у меня в голове, заключалась в том, чтобы использовать модуль URL Rewrite для перезаписи статического URL файла в файл, специфичный для моего сайта, но это, похоже, не работает:

<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" />
  <error statusCode="404" path="/404.html" responseMode="ExecuteURL" />
  <remove statusCode="500" />
  <error statusCode="500" path="/500.html" responseMode="ExecuteURL" />
</httpErrors>

И правила перезаписи:

<rule name="Rewrite Error Pages - Site 1" enabled="true" stopProcessing="true">
  <match url="^(\d{3}).html$" />
  <conditions logicalGrouping="MatchAny">
      <add input="{HTTP_HOST}" pattern="^mysite1.com$" />
  </conditions>
  <action type="Rewrite" url="{R:1}-mysite1.html" />
</rule>
<rule name="Rewrite Error Pages - Site 2" enabled="true" stopProcessing="true">
  <match url="^(\d{3}).html$" />
  <conditions logicalGrouping="MatchAny">
      <add input="{HTTP_HOST}" pattern="^mysite2.com$" />
  </conditions>
  <action type="Rewrite" url="{R:1}-mysite2.html" />
</rule>

Итак, у меня есть несколько статических HTML-файлов для каждого сайта:

Правила перезаписи работают нормально, когда я перехожу в http://mysite1.com/404.html например, так как он перепишет его правильно и вернет содержимое 404-site1.html.

Но когда я перехожу на несуществующий URL (например, http://mysite1.com/foo) он вернет пустую страницу. Я вижу в трассировке запроса (включенной с помощью трассировки неудачных запросов в IIS), что он правильно пытается запросить /404.html (как в моем httpErrors раздел), но затем он не будет переписывать его в /404-site1.html.

Кто-нибудь знает, возможно ли это вообще? Или есть другие способы настроить статические страницы ошибок HTML для разных доменов на одном сайте IIS?

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

Поэтому я удалил правила перезаписи URL, упомянутые в вопросе, и изменил httpErrors к этому:

<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" />
  <error statusCode="404" path="/404.aspx" responseMode="ExecuteURL" />
  <remove statusCode="500" />
  <error statusCode="500" path="/500.aspx" responseMode="ExecuteURL" />
</httpErrors>

И в 404.aspx файл делаю следующее:

<%@ page trace="false" validateRequest="false" %>

<%-- set correct site name based on request domain --%>
<% string siteName = ""; %>
<% string hostName = Request.Url.Host; %>

<% if (hostName == "mysite1.com") { siteName = "mysite1"; } %>
<% if (hostName == "mysite2.com") { siteName = "mysite2"; } %>

<%-- return file content with a 404 status code --%>
<% Response.StatusCode = 404; %>
<% if (!string.IsNullOrEmpty(siteName)) { Response.WriteFile("404-" + siteName + ".html"); } %>

Кажется, это нормально работает для того, что я хочу.