当给定一个错误的URL时,cURL连接到本地主机


cURL connecting to the localhost when given a bad URL

我正在浏览用户提供的url列表,以查看哪些url在请求时没有从服务器获得有效的HTTP响应代码。在QA期间,我们发现类似http://broken的链接并没有被标记为无效。

我们有一个php脚本,它使用cURL获取http头并解析出响应代码。我们确实允许重定向,并且如果有许多重定向,则使用返回的最终响应代码跟踪它们。一个测试说对http://broken的请求返回200。显然不是我想要的。我想,那个格式不正确的url应该会产生404响应。

我把代码拉到一个小测试工具中:

<?php
util_url_get_response_code("http://broken", true);
function util_url_get_response_code ($url, $follow_redirect = false) {
    $handle = curl_init($url);
    curl_setopt( $handle, CURLOPT_NOBODY, true );
    curl_setopt( $handle, CURLOPT_HEADER, true );
    curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($handle,  CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($handle,  CURLOPT_SSL_VERIFYPEER, FALSE);
    if ($follow_redirect) { curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true); }
    $data = curl_exec( $handle );
    $err = curl_error($handle);
    curl_close( $handle );
    print_r($data);
}
?>

当测试代码运行时,打印的头看起来像这样:

HTTP/1.1 302 Found
Date: Mon, 10 Jun 2013 17:39:30 GMT
Server: Apache/2.0.52 (CentOS)
X-Powered-By: PHP/5.1.6
Location: http://www.nitrc.org/
Content-Type: text/html; charset=UTF-8
HTTP/1.1 200 OK
Date: Mon, 10 Jun 2013 17:39:40 GMT
Server: Apache/2.0.52 (CentOS)
X-Powered-By: PHP/5.1.6
Set-Cookie: PHPSESSID=oorncckdt198341u4lccpoai12; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Type: text/html; charset=UTF-8

看第一个标题,看起来cURL联系了www.nitrc.org服务器…也就是我们的网址。NITRC被配置为将未知的url重定向到主页,所以我们最终得到一个200 OK响应头。

那么,我该怎么做才能让cURL查看http://broken并像浏览器一样返回404错误呢?

(注意,我不能关闭重定向处理,因为它是遵循任何有效重定向的要求的一部分!)

感谢Brad为我指出了正确的方向:

我们的测试服务器在DNS中定义了一个通配符*.nitrc.org,在resolve.conf中也有一个"search nitrc.org"指令。因此,每个无效的域名将被添加到nitrc.org,然后将匹配我们的通配符dns。