fsockopen имеет ошибки: HTTP / 1.1 301 перемещено навсегда и 404 - PullRequest
1 голос
/ 30 ноября 2011

Я использовал этот код для открытия whatismyipaddress.com

$fp = fsockopen("whatismyipaddress.com", 80, $errno, $errstr, 5);

if ($fp) {
    $url = "/";

    fputs($fp, "GET $url HTTP/1.1\r\nHost: {whatismyipaddress.com}\r\nConnection: close\r\n\r\n");
    $resp = '';

    while(!feof($fp)) {
        $resp .= fgets($fp, 1024);
    }

    echo "$resp";
}

, и я всегда вижу эту ошибку

HTTP / 1.1 301 Дата окончательно перенесена Дата: вторник, 29 ноября2011 20:19:36 GMT Сервер: Apache / 2.2.17 (Unix) DAV / 2 Расположение: http://whatismyipaddress.com/ MS-Author-Via: DAV Длина содержимого: 0 Соединение: закрыть Тип содержимого: текст / html

Также я использовал этот код для открытия whatismyipaddress.com/proxy-check

$fp = fsockopen("whatismyipaddress.com", 80, $errno, $errstr, 5);

if ($fp) {
    $url = "/proxy-check";

    fputs($fp, "GET $url HTTP/1.1\r\nHost: {whatismyipaddress.com}\r\nConnection: close\r\n\r\n");
    $resp = '';

    while(!feof($fp)) {
        $resp .= fgets($fp, 1024);
    }

    echo "$resp";
}

и получил эту ошибку

HTTP / 1.1 404 Дата не найдена:Вторник, 29 ноября 2011 20:32:07 GMT Сервер: Apache / 2.2.17 (Unix) DAV / 2 Длина контента: 421 Соединение: закрыть Тип контента: текст / html;charset = iso-8859-1 Not Found

Запрошенная проверка URL / прокси-сервера не найдена на этом сервере.

Кроме того, при попытке использования ErrorDocument обнаружена ошибка 404 Not Found.обработать запрос.Сервер Apache / 2.2.17 (Unix) DAV / 2 по адресу {whatismyipaddress.com} Порт 80

Уверен, с кодами проблем нет.Я проверил его на многих сайтах, и у меня не возникло проблем

Пожалуйста, кто-нибудь может объяснить эту проблему?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 30 ноября 2011

Я бы попытался использовать другой пользовательский агент в заголовках.Я уверен, что они блокируют роботов, используя какую-то защиту на основе заголовков.

Используя curl:

$ curl -I 'http://whatismyipaddress.com'
HTTP/1.1 403 Forbidden
Date: Tue, 29 Nov 2011 20:48:28 GMT
Server: Apache/2.2.17 (Unix) DAV/2
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=iso-8859-1

Однако, после попытки принудительного пользовательского агента это работает:

$ curl -I -A 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:8.0.1) Gecko/20100101 Firefox/8.0.1' 'http://whatismyipaddress.com'
HTTP/1.1 200 OK
Date: Tue, 29 Nov 2011 20:49:24 GMT
Server: Apache/2.2.17 (Unix) DAV/2
Set-Cookie: pt=f737a9bb1a119dcec75073f11b05d213; expires=Wed, 30-Nov-2011 20:49:24 GMT
MS-Author-Via: DAV
Vary: Accept-Encoding
Content-Type: text/html
1 голос
/ 30 ноября 2011

В основном ваш скрипт работает нормально. Есть некоторые ошибки. Один специфичен для HTTP, смотрите эту строку кода:

fputs($fp, "GET $url HTTP/1.1\r\nHost: {whatismyipaddress.com}\r\nCon ...
                                       ^                     ^

Снимите эти скобки, в протоколе HTTP их нет, вам нужно указать действительное имя хоста. Решение:

fputs($fp, "GET $url HTTP/1.1\r\nHost: whatismyipaddress.com\r\nCon ...

Тогда удаленный сайт скажет, что вам нужен пользовательский агент. Добавьте его в качестве дополнительного заголовка:

fputs($fp, "GET $url HTTP/1.1\r
Host: whatismyipaddress.com\r
Connection: close\r
User-Agent: Florian der Fensterputzer\r\n\r\n");

Это сделает это. Демо .

...