这对我来说似乎不正确,所以我正在找人告诉我我是如何错误配置 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 转储它正在侦听的列表?
这是设计使然。URL 预留与 URL 注册不同,后者在应用程序向 HTTP.SYS 注册以进行监听时动态发生。对于 URL Reservation,HTTP.SYS 不知道给定 Reservation 中的 URL 是暂时不可用还是根本不存在。在这种情况下,它只能知道有一个有效的主机名匹配(因为你的强/弱通配符),但 URL 路径与任何当前注册的侦听器都不匹配。
如果您想要 400 或 503 响应,则要么不使用任何 URL 预留,要么使用不包含通配符的显式 URL 预留。简而言之,如果您配置 HTTP.SYS 使其可以将 URL 的前缀匹配到任何保留(包括通过注册创建的动态保留),那么它将把请求传递给监听应用程序(如果其余匹配),或者返回如果找不到活动的注册侦听器,则为 404。
另一个可能更简单的解决方案是使用 IIS 服务本身来管理发送 503。为此,不要停止该站点,而是停止与其关联的应用程序池。这将导致在 HTTP.SYS 中出现完全限定的匹配(即使使用 wlidcard URL Reservations),但会导致 503,因为没有 AppPool 可将请求传递到。
是否在您不知道的 IIS 实例上安装了一个活动的HTTP 模块来捕获所有请求?
或者您是否忘记了要停止活动/运行的默认网站(标准 IIS 安装附带),然后会有一个空绑定。
默认网站标准绑定为空,这意味着它接受所有 HTTP 主机标头。
好的,在与 MS 技术支持“愉快”的几个小时之后,我们对于这是否是一个错误没有达成一致意见,但我们同意问题源于“ http://+5000的存在/Temporary_Listen_Address/ " 由 WCF 添加。
作为“解决方法”,如果您以以下格式为您的站点添加更具体的 urlacl:netsh http add urlacl url= http://hostname:80/ user=networkservice listen=yes delegate=yes
那么你会得到一个 503,而不是 404。我认为这是一个“错误”,MS 正在“检查”(不是屏住呼吸)。
对于那些遇到这个问题的人,问题 # 是 REG:112060473529066。
好的,弄清楚了(但我认为这是一个错误,需要稍后向 MS 报告)。如果我使用“netsh http show urlacl”查看为 HTTPSys 列出的 URLACL,我会看到“ http://+:80/Temporary_Listen_Address/ ”的注册。这不应该与我发送的请求匹配,但它似乎是匹配的。根据 UrlPrefix 上的文档,它不会不匹配,但根据我的测试,它会匹配。
当我在端口 5000 上创建一个新站点时,没有注册 temporary_listen_address 一切都按我预期的那样工作。在端口 5000 上运行两个站点(不同的主机标头)时,对已停止站点的请求返回错误 400。但是,如果我随后注册一个“ http://+:5000/test/ ”的 urlacl(netsh http add urlacl)和请求与该 url 前缀不匹配的内容,我得到 404。删除注册,我再次得到 400。
总的来说,我喜欢 HTTPSys,但是当你深入研究它时,它太复杂了。稍后将更新 w/MS 的响应。我在 connect.microsoft.com 上看不到可以报告它的地方,所以我必须打电话。