我正在尝试确定是否有办法检查可能较大的网址列表(> 1000000)的可用性,而无需向每个网址发送GET请求。
如果http://www.example.com无法访问(如无法连接到服务器或域的DNS请求失败),或者我收到4XX或5XX响应,那么来自该域的任何内容都是安全的吗?也是无法访问的(例如http://www.example.com/some/path/to/a/resource/named/whatever.jpg)? 302响应(比如说what.jpg)是否足以使第一个假设无效?我认为子域名应该被视为不同的http://subdomain.example.com而http://www.example.com可能不会指向同一个IP?
我似乎能够想到我提出的每个捷径的反例。我应该咬紧牙关并向每个URL发送GET请求吗?
答案 0 :(得分:7)
很遗憾,您无法推断4xx
或5xx
或任何其他代码的任何内容。
这些代码适用于单个页面,不适用于服务器。很可能一个页面关闭而另一个页面打开,或者一个页面有500个服务器端错误而另一个页面没有。
您可以使用HEAD
代替GET
。它检索页面的MIME标头,但不检索页面内容。这节省了服务器端的时间(因为它不必渲染页面)和自己(因为您不必缓冲然后丢弃内容)。
另外,我建议您使用keep-alive
加速来自同一服务器的响应。许多HTTP客户端库都会为您执行此操作。
答案 1 :(得分:3)
主机(例如www.example.com)的DNS查找失败应该足以使该主机的所有URL无效。但是,必须单独检查子域或其他主机。
4xx代码可能会告诉您某个特定页面不可用,但您无法对其他页面做出任何假设。
5xx代码真的不会告诉你任何事情。例如,可能是页面在那里,但服务器此刻太忙了。如果你以后再试一次它可能会正常工作。
答案 2 :(得分:1)
您应该对URL的可用性做出的唯一假设是“获取URL可能会失败”。
假设子域请求在父域请求失败时是不安全的。也就是因为在您的两个请求之间,您的网络连接可能会上升,下降或通常行为不端。也可以在请求之间更改域。
忽略所有互联网连接问题。您仍在处理可以并且将会不断变化的实时网站。当他们决定改变他们的页面结构或改变显示特定页面的方式时,现在可能不会在5分钟内成立。你最好的选择是假设任何获胜都会失败。
这似乎是一个极端的观点。但这些事件将发生。如何处理它们将决定程序的稳健性。
答案 3 :(得分:1)
首先不要假设基于单个页面失败的任何内容。我见过很多情况,IIS将继续提供静态内容,但无法提供任何动态内容。
您必须将每个主机名视为唯一,您不能假设subdomain.example.com和example.com指向相同的IP。或者即使他们这样做,也没有相同网站的保证。 IIS再次具有允许您使用单个IP地址运行多个站点的主机标头。
答案 4 :(得分:0)
如果与服务器的连接确实失败,则没有理由检查该服务器上的URL。否则,你不能假设任何事情。
答案 5 :(得分:0)
除了其他人的意见外,请使用HEAD个请求而不是GET请求。它们的功能相同,但响应不包含消息体,因此可以为每个人节省一些带宽。