在 IIS 中为不同的域设置不同的静态错误页面

在 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 文件:

  • 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

有人知道这是否可行吗?或者还有其他方法可以在同一个 IIS 站点中为不同的域设置静态 HTML 错误页面吗?

答案1

最后我发现使用 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"); } %>

对于我想要它做的事情来说,这似乎很有效。

相关内容