是否有关于URL可用性的安全假设?

时间:2009-03-05 19:53:09

标签: http url

我正在尝试确定是否有办法检查可能较大的网址列表(> 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.comhttp://www.example.com可能不会指向同一个IP?

我似乎能够想到我提出的每个捷径的反例。我应该咬紧牙关并向每个URL发送GET请求吗?

6 个答案:

答案 0 :(得分:7)

很遗憾,您无法推断4xx5xx或任何其他代码的任何内容。

这些代码适用于单个页面,不适用于服务器。很可能一个页面关闭而另一个页面打开,或者一个页面有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请求。它们的功能相同,但响应不包含消息体,因此可以为每个人节省一些带宽。