fsockopen есть ошибки: HTTP/1.1 301 перемещен навсегда и 404

Я использовал этот код, чтобы открыть 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 Content-Length: 0 Connection: close Content-Type: text/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 Not Found Дата: вторник, 29 ноября 2011 г., 20:32:07 GMT Сервер: Apache/2.2.17 (Unix) DAV/2 Content-Length: 421 Connection: close Content-Type: text/html; кодировка = iso-8859-1 не найдена

Запрошенный URL-адрес /proxy-check не найден на этом сервере.

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

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

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

Спасибо.


person Maroman    schedule 29.11.2011    source источник
comment
попробуйте http://whatismyipaddress.com (с http://)   -  person Madara's Ghost    schedule 30.11.2011
comment
Удалите {} вокруг имени домена в заголовке Host: в запросе.   -  person DaveRandom    schedule 30.11.2011
comment
Обратите внимание на whatismyipaddress.com/terms-of-use: вы не можете использовать сценарий, агент, приложение или иным образом запрашивать этот веб-сайт в автоматическом режиме без предварительного письменного разрешения.   -  person    schedule 30.11.2011
comment
@Phoenix.Спасибо, я позабочусь об этом.С уважением   -  person Maroman    schedule 30.11.2011


Ответы (2)


В принципе ваш скрипт работает нормально. Есть некоторые ошибки. Один относится к 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");

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

person hakre    schedule 29.11.2011
comment
Большое спасибо, Хакре. С наилучшими пожеланиями. - person Maroman; 30.11.2011
comment
Ребята подождите... не бросайте меня - person Maroman; 30.11.2011
comment
Проблема с Advanced Proxy Check whatismyipaddress.com/proxy-check эта страница будет проверять IP-адрес DNS-хостинга, а не REMOTE_ADRR для посетителя. Возможно ли это сделать? - person Maroman; 30.11.2011
comment
Чтобы получить IP-адрес вашего посетителя (лучше компьютера, который обращается к вашему скрипту, например, прокси), вы можете использовать $_SERVER['REMOTE_ADDR']. В любом случае, это только технические детали, сравните с Как показать другую домашнюю страницу в зависимости от страны пользователя?. Служба, которую вы используете (whatismyipaddress.com), ИМХО, обманывает своих посетителей, поэтому я не буду предлагать им какую-либо поддержку. . - person hakre; 30.11.2011
comment
Я просто хочу использовать эту службу для обнаружения посетителя, который использует aproxy. Я думаю, что это невозможно с помощью fsockopen, верно? - person Maroman; 30.11.2011
comment
Насколько я понимаю, вы не можете указать IP-адрес в виде параметра, поэтому whatismyipadress.com это невозможно. fsockopen — это всего лишь функция для открытия сокета и выполнения HTTP-запроса, такая же, как и file_get_contents или что-то вроде curl. Так что это больше связано с используемой вами службой HTTP, чем с конкретной функцией, которую вы используете для использования службы HTTP. - person hakre; 30.11.2011
comment
Это нормально .. Спасибо, хакре :) - person Maroman; 30.11.2011
comment
Просто для уточнения: $_SERVER['REMOTE_ADDR'] будет содержать адрес, который вы хотите проверить, но wimipadrr.com/proxy-check HTTP-сервис не предоставляет параметр IP, чтобы он специально проверял IP-адрес, который вы хотите проверить (по крайней мере, я так думаю, я не не очень разработал этот сервис, как написано, я не люблю их поддерживать). - person hakre; 30.11.2011
comment
да, я понимаю вашу точку зрения... кстати, я нашел кое-что здесь php.net/ manual/en/function.fsockopen.php возможно, я смогу подключиться через fsockopen по IP-адресу и порту прокси-сервера :), и я добавлю IP-адрес прокси-сервера $_SERVER['REMOTE_ADDR'].. я должен попробовать - person Maroman; 30.11.2011
comment
Конечно, вы можете попытаться обмануть их скрипт, имитируя поддельные прокси-заголовки. Это, наверное, работает ;) - person hakre; 30.11.2011

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

Использование завитка:

$ 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
person u.k    schedule 29.11.2011
comment
Это правильно, они блокируют клиентов, которые, по их мнению, являются ботами, такими как curl, lynx или запросы без заголовка пользовательского агента. Ему нужно подделать запрос, используя действительный пользовательский агент из Firefox, Chrome, IE и т. д. - person drew010; 30.11.2011
comment
Большое спасибо Uzi & Draw010 С наилучшими пожеланиями. - person Maroman; 30.11.2011