这对我来说似乎不正确,所以我想找人告诉我我是如何错误配置 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 转储它正在监听的内容列表吗?
答案1
这是设计使然。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 来传递请求。
答案2
是否有活跃HTTP 模块安装在您不知道的 IIS 实例上哪个可以捕获所有请求?
或者你忘了停止默认网站(带有标准 IIS 安装)处于活动状态/正在运行,然后是空的绑定。
默认网站标准绑定为空白,这意味着它接受所有 HTTP 主机标头。
答案3
好吧,在与微软技术支持人员“愉快”地度过了几个小时后,我们对于这是否是一个错误并没有达成一致意见,但我们一致认为问题源于“http://+5000/临时监听地址/“这是由 WCF 添加的。
作为一种“解决方法”,您可以为您的网站添加更具体的 urlacl,格式如下:netsh http add urlacl url=http://主机名:80/用户=网络服务监听=是委托=是
那么你将得到 503,而不是 404。我坚持认为这是一个“错误”,MS 正在“检查”(我没有屏住呼吸)。
对于遇到此问题的人,问题编号是 REG:112060473529066。
答案4
好的,搞清楚了(但我认为这是一个错误,需要稍后向 MS 报告)。如果我使用“netsh http show urlacl”查看 HTTPSys 列出的 URLACL,我会看到“http://+:80/临时监听地址/“。这不应该与我发送的请求匹配,但它似乎匹配。根据 UrlPrefix 上的文档,它不会匹配,但根据我的测试,它匹配。
当我在端口 5000 上创建新站点时,没有注册 temporary_listen_address,一切都按我预期的方式运行。当两个站点(不同的主机标头)在端口 5000 上运行时,对已停止站点的请求返回错误 400。但是,如果我随后注册 urlacl(netsh http add urlacl)“http://+:5000/测试/“并请求与该 url 前缀不匹配的内容,我得到 404。删除注册后我再次得到 400。
总的来说,我喜欢 HTTPSys,但深入研究后会发现它非常复杂。稍后会更新 MS 的回复。我在 connect.microsoft.com 上没有找到可以报告的地方,所以我必须打电话。