通过 fsockopen 读取 http 状态代码


Read http status code by fsockopen

根据这篇文章中的@JoyceBabu 使用cURL获取没有正文的http-statuscode? 应该可以使用fsockopen获取URL的HTTP状态代码。

所以我从@JoyceBabu中获取了有效的代码:

    <?php
$fp = fsockopen("www.google.com", 80, $errno, $errstr, 30);
if ($fp) {
    $out = "GET / HTTP/1.1'r'n";
    $out .= "Host: www.google.com'r'n";
    $out .= "Accept-Encoding: gzip, deflate, sdch'r'n";
    $out .= "Accept-Language: en-GB,en-US;q=0.8,en;q=0.6'r'n";
    $out .= "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'r'n";
    $out .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'r'n";
    $out .= "Connection: Close'r'n'r'n";
    fwrite($fp, $out);
    $tmp = explode(' ', fgets($fp, 13));
    echo $tmp[1];
    fclose($fp);
}

然后我更改了要读取的 URL www.raffiniert.biz/aktuell:

    <?php
$fp = fsockopen("www.raffiniert.biz", 80, $errno, $errstr, 30);
if ($fp) {
    $out = "GET / HTTP/1.1'r'n";
    $out .= "Host: www.raffiniert.biz/aktuell'r'n";
    $out .= "Accept-Encoding: gzip, deflate, sdch'r'n";
    $out .= "Accept-Language: en-GB,en-US;q=0.8,en;q=0.6'r'n";
    $out .= "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'r'n";
    $out .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'r'n";
    $out .= "Connection: Close'r'n'r'n";
    fwrite($fp, $out);
    $tmp = explode(' ', fgets($fp, 13));
    echo $tmp[1];
    fclose($fp);
}

返回 http 400 - 这是不正确的。

另一个示例:www.raffiniert.biz/kunden 返回 301。这应该是 403。

知道我做错了什么吗?

谢谢拉斐尔

此行

$out .= "Host: www.raffiniert.biz/aktuell'r'n";

是问题所在。

在 HTTP GET 中,Host标头就是主机(域名),主机内的路径在GET行中提供。你应该这样写:

$out = "GET /aktuell HTTP/1.1'r'n";
$out .= "Host: www.raffiniert.biz'r'n";

关于更新的信息:

另一个示例:www.raffiniert.biz/kunden 返回 301。这应该是 403。

www.raffiniert.biz/kunden给出一个 301,它重定向到 www.raffiniert.biz/kunden/(带有尾部斜杠),给出 403。浏览器将自动执行该重定向(即它将发送两个连续的请求),并隐藏 301。

如果您要求 woth "GET /kunden/ HTTP/1.1'r'n"您将直接获得 403。

下面会给你200的回报

我已经更新了第 4 行和第 5 行,请求获取/aktuell

<?php
$fp = fsockopen("www.raffiniert.biz", 80, $errno, $errstr, 30);
if ($fp) {
    $out = "GET /aktuell HTTP/1.1'r'n";
    $out .= "Host: www.raffiniert.biz'r'n";
    $out .= "Accept-Encoding: gzip, deflate, sdch'r'n";
    $out .= "Accept-Language: en-GB,en-US;q=0.8,en;q=0.6'r'n";
    $out .= "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'r'n";
    $out .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'r'n";
    $out .= "Connection: Close'r'n'r'n";
    fwrite($fp, $out);
    $tmp = explode(' ', fgets($fp, 13));
    echo $tmp[1];
    fclose($fp);
}
?>