У меня есть один веб-сайт 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-файлов для каждого сайта:
404-mysite1.html
500-mysite1.html
404-mysite2.html
500-mysite2.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"); } %>
Кажется, это нормально работает для того, что я хочу.