当前位置: 首页 > 面试题库 >

get_headers不一致

燕青青
2023-03-14
问题内容

运行以下代码

var_dump(get_headers("http://www.domainnnnnnnnnnnnnnnnnnnnnnnnnnnn.com/CraxyFile.jpg"));

对于任何不存在的域或URL,返回HTTP 200而不是404

Array
(
    [0] => HTTP/1.1 200 OK
    [1] => Server: nginx/1.1.15
    [2] => Date: Mon, 08 Oct 2012 12:29:13 GMT
    [3] => Content-Type: text/html; charset=utf-8
    [4] => Connection: close
    [5] => Set-Cookie: PHPSESSID=3iucojet7bt2peub72rgo0iu21; path=/; HttpOnly
    [6] => Expires: Thu, 19 Nov 1981 08:52:00 GMT
    [7] => Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    [8] => Pragma: no-cache
    [9] => Set-Cookie: bypassStaticCache=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; httponly
    [10] => Set-Cookie: bypassStaticCache=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; httponly
    [11] => Vary: Accept
)

如果你跑

var_dump(get_headers("http://www.domain.com/CraxyFile.jpg"));

你得到

Array
(
    [0] => HTTP/1.1 404 Not Found
    [1] => Date: Mon, 08 Oct 2012 12:32:18 GMT
    [2] => Content-Type: text/html
    [3] => Content-Length: 8727
    [4] => Connection: close
    [5] => Server: Apache
    [6] => Vary: Accept-Encoding
)

它们get_headers被证明是验证现有URL的解决方案的实例很多

这是Bug还是get_headers不是验证URL的可靠方法

观看现场演示

更新1

发现CURL也有同样的问题

$curl = curl_init();
curl_setopt_array($curl, array(CURLOPT_RETURNTRANSFER => true,CURLOPT_URL => 'idontexist.tld'));
curl_exec($curl);
$info = curl_getinfo($curl);
curl_close($curl);
var_dump($info);

问题答案:

问题与域名的长度无关,只是域名是否存在。

您正在使用DNS服务,该服务将不存在的域解析到服务器,该服务器为您提供“友好的”错误页面,该页面返回200响应码。这意味着它也不是一个问题get_headers(),它完全依赖于合理的DNS查找。

在不对所使用的每个环境进行硬编码的情况下解决此问题的方法可能类似于以下内容:

// A domain that definitely does not exist. The easiest way to guarantee that
// this continues to work is to use an illegal top-level domain (TLD) suffix
$testDomain = 'idontexist.tld';

// If this resolves to an IP, we know that we are behind a service such as this
// We can simply compare the actual domain we test with the result of this
$badIP = gethostbyname($testDomain);

// Then when you want to get_headers()
$url = 'http://www.domainnnnnnnnnnnnnnnnnnnnnnnnnnnn.com/CraxyFile.jpg';

$host = parse_url($url, PHP_URL_HOST);
if (gethostbyname($host) === $badIP) {
  // The domain does not exist - probably handle this as if it were a 404
} else {
  // do the actual get_headers() stuff here
}

您可能希望以某种方式缓存对的第一次调用的返回值gethostbyname(),因为您知道自己正在查找不存在的名称,这通常需要几秒钟的时间。



 类似资料:
  • My Discord bot在启动后至少切换到1个其他语音频道之前,无法识别语音频道中的成员(加入频道后,用户必须手动切换到其他频道,然后返回,以便bot识别成员并将其移动到所需频道)。这有点违反直觉,违背了我机器人的目的。

  • 我得到了一个错误,我完全不知道如何去修复它。环顾stackoverflow,这个错误似乎与损坏的文件或在不兼容的Java版本中编译的类有关。这是我一直在研究的问题之一:获得java.lang.VerifyError的原因 为了消除这类错误,我清理了项目好几次,删除了我找到的每个.class文件。将所有的依赖项(JAR)更新到最新版本,对于比较模糊的JAR,我找不到新的版本,因为我跟踪了源代码,并将

  • JButton两个显示器有两个位置和大小,有两个类 它与大小和位置不一致,请帮助,谢谢下面的代码分为两部分 最终公共类ChessMain{ } 类DrawPanelChess扩展JPanel{ 公共无效绘制组件(图形g){ ###

  • 问题内容: 下面的代码应该可以像在FF,IE或Chrome这样的浏览器中看到的多文档界面(MDI)一样工作。它在选项卡式窗格中显示“文档”(黑色缓冲的图像作为分隔符),以便用户可以选择将其从窗格中拖到新(或现有)窗口中。 但是,一旦没有更多选项卡,关闭框架就存在问题;没有更多可见窗口时,关闭JVM也存在问题。我 想 我通过在中进行检查来修复它们: 它检查开放框架的实例 如果找到一个,则检查选项卡计

  • 我编写了下面的代码来弄清楚onTextChanged()方法是如何工作的: 我注意到:当我只打字时,计数非常简单: 现在,如果我添加3个(或更多)数字,然后继续键入字母,就会发生以下情况: 对我来说,输入3位数字似乎会以某种方式改变TextWatcher的行为,使其将之后的所有内容视为Char而不是CharSequence。 对这种行为有什么解释吗?

  • 我得到了一个unban命令代码,在控制台中出现以下错误: (节点:9348)未处理的PromisejectionWarning:TypeError:无法读取未定义的at对象的属性“member”。在客户端执行(C:\Users\19nik\Documents\GitHub\bot project\commands\unban.js:9:22)。(C:\Users\19nik\Documents\G