Прочитать код статуса http от fsockopen

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

Есть идеи, что я делаю не так?

Спасибо
Рафаэль

0

Решение

Эта линия

$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 напрямую.

2

Другие решения

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

Я обновил 4-ю и 5-ю строчки с просьбой получить / 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);
}
?>
0

По вопросам рекламы [email protected]