通过fsockopen读取http状态代码

时间:2014-12-01 21:32:26

标签: php http url fsockopen

根据@JoyceBabu在这篇文章Get http-statuscode without body using cURL?上应该可以使用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.

任何想法我做错了什么?

由于 圣拉斐尔

2 个答案:

答案 0 :(得分:2)

这一行

$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。

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

答案 1 :(得分:0)

下面会给你200的回报

我更新了要求获得/ aktuell的第4行和第5行

<?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);
}
?>