IIS 7.5 为未知主机名返回 404

Wal*_*enL 5 iis iis-7.5 windows-server-2008-r2

这对我来说似乎不正确,所以我在找人告诉我我是如何错误配置 IIS 的...配置是 IIS7.5 (2008R2),没有 SP1。

我有几个站点配置了 IIS 7.5。所有站点都在绑定中定义了主机名,没有没有主机名的站点。但是,如果我从服务器 IIS(技术上为 Microsoft-HTTPAPI/2.0)请求未知主机名,则返回 404 错误,而不是 400 错误。我希望得到 400(或其他一些主要错误)而不是低级 404。

当我在多个 IIS 前面有 nginx 并且想要停止站点以便 nginx 将其停止旋转时,这会导致问题。由于即使没有该名称的活动站点,IIS 仍会为请求返回 404,因此 nginx 不知道服务器已死。

注意:无论是否有服务器,IIS 都会返回 404,但它已停止,或者没有服务器。

想法?解决方案?

-- 附加信息:好的,我在 80 (5000) 以外的端口上添加了一个站点,然后在与该端口的连接上请求了一个不存在的站点,我得到了预期的错误 400(主机名无效)。因此,虽然 IIS 没有侦听端口 80 上的通用(无主机名)连接,但似乎有些事情是这样。任何想法如何让 HTTPSys 转储它正在侦听的列表?

小智 2

这是设计使然。URL 预留与 URL 注册不同,URL 注册是在应用程序向 HTTP.SYS 注册以进行侦听时动态发生的。对于 URL 预留,HTTP.SYS 不知道给定预留中的 URL 是暂时不可用还是根本不存在。在这种情况下,它所能知道的是存在有效的主机名匹配(因为您的强/弱通配符),但 URL 路径与任何当前注册的侦听器都不匹配。

如果您想要 400 或 503 响应,则不要使用任何 URL 预留,或使用不包含通配符的显式 URL 预留。简而言之,如果您配置 HTTP.SYS,使其可以将 URL 的前缀与任何预订(包括通过注册创建的动态预订)相匹配,那么它将要么将请求传递给侦听应用程序(如果其余部分匹配),要么返回如果找不到活动的注册侦听器,则返回 404。

另一个可能更简单的解决方案是使用 IIS 服务本身来管理发送 503。为此,不要停止站点,而是停止与其关联的应用程序池。这将导致 HTTP.SYS 中发生完全限定的匹配(即使使用 wlidcard URL 保留),但会导致 503,因为没有 AppPool 可以将请求传递到。