2014-12-01 5 views
0

в соответствии с @JoyceBabu на этом посту Get http-statuscode without body using cURL? должно быть возможно получить код статуса http URL-адреса с fsockopen.Прочитайте код 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", вы получите это прямо сейчас.

+0

Я вижу, ГЭТ строки в своем коде был «/» ... Я устал, извините :) во всяком случае, он не работает на некоторых URL-адресах, я собираю несколько примеров –

+0

@RaphaelJeger См. обновленный ответ – outlyer

+0

спасибо, я видел это тем временем. Теперь это быстрое решение, но оно должно решить окончательное перенаправление ... –

0

Ниже даст вам возврат 200

Я обновил 4'th и 5'th линию запрашивающей ГЭТ из/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

Не вырезать/вставлять большой код кода без объяснения того, что вы изменили. –

+0

Я получаю http 301? –

+0

Если вы запустите его несколько раз, вы заметите, что он переключается туда и обратно с 301 до 200. Это, вероятно, серверная вещь. Вероятно, он не обрабатывает запрос, что приводит к другому коду. – Demodave

Смежные вопросы