IIS 7.5为未知主机名返回404

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

我有IIS 7.5configuration几个网站。 所有站点都有绑定中定义的主机名,没有主机名的站点。 但是,如果我从服务器IIS(技术上Microsoft-HTTPAPI / 2.0)请求未知的主机名返回404错误,而不是400错误。 我会期望一个400(或其他一些重大错误),而不是一个低404。

这导致了一个问题,当我有nginx在多个IIS前,并希望停止一个网站,所以nginx使它不能旋转。 由于即使没有该名称的活动站点,IIS仍然会返回404请求,所以nginx不知道服务器已经死亡。

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

思考? 解决scheme?

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

这是devise。 URL保留与URL注册不同,当应用程序向HTTP.SYS注册时,它会dynamic地发生。 在URL保留的情况下,HTTP.SYS不知道给定保留中的URL是暂时不可用还是完全不存在。 在这种情况下,所有可以知道的是有一个有效的主机名匹配(因为您的强/弱通配符),但是URLpath与任何当前注册的侦听器都不匹配。

如果您需要400或503响应,则不要使用任何URL保留,或使用不包含通配符的显式URL保留。 简而言之,如果将HTTP.SYSconfiguration为可以将URL的前缀与任何保留 (包括通过注册创build的dynamic保留 )相匹配,那么它将向侦听应用程序发送请求(如果其余部分匹配)或返回一个404,如果它不能find一个活跃的注册侦听器。

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

是否有一个活动的HTTP模块安装在您不知道哪个捕获所有请求的IIS实例上?

或者你忘记了停止默认网站 (它与一个标准的IIS安装)active / running,然后有一个空的绑定。

默认网站的标准绑定是空白的,这意味着它接受所有的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上的文档,它不会匹配,但是按照我的testing它。

当我在5000端口上创build一个新的站点时,没有注册temporary_listen_address都按我的预期工作。 如果在端口5000上运行两个站点(不同的主机头),则对停止的站点的请求将返回错误400.但是,如果我然后注册了“ http:// +:5000 / test / ”的urlacl(netsh http add urlacl)请求与URL前缀不匹配的东西,我得到一个404.删除注册,我再次得到一个400。

一般来说,我喜欢HTTPSys,但是当你深入研究它时,这很复杂。 稍后将更新w / MS的响应。 我没有看到connect.microsoft.com上的一个地方报告,所以我必须打电话。