我有一个 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"); } %>
对于我想要它做的事情来说,这似乎很有效。