2014-12-01 118 views
0

根据@JoyceBabu在这篇文章Get http-statuscode without body using cURL?应该可以通过fsockopen获取一个URL的http状态码。阅读http状态码fsockopen

所以我从@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

此行

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

+0

我看到,GET线在我的代码是“/”...我累了,对不起:)无论如何,它不适用于某些网址,我收集了一些示例 – 2014-12-01 21:52:33

+0

@RaphaelJeger查看更新的答案 – outlyer 2014-12-01 22:53:08

+0

谢谢,我在此期间看到了。现在这是一个快速解决方案,但它应该可以解决最终的重定向... – 2014-12-01 23:02:15

0

下面会给你200

的回报,我已经更新了第4'和第5'线要求的get/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); 
} 
?> 
+1

不要在没有解释你已经改变了什么的情况下剪切/粘贴大量代码。 – 2014-12-01 21:48:24

+0

我得到一个http 301? – 2014-12-01 21:51:06

+0

如果你多次运行它,你会注意到它会从301切换到200.这可能是服务器的事情。它可能没有完成处理请求,从而导致不同的代码。 – Demodave 2014-12-01 21:53:47