Как предотвратить ошибки 403 в HTTP-запросах, отправленных PHP?

Я использую следующий скрипт для публикации данных на внешнем сайте. В приведенном ниже примере $method, $url и $postdata уже были собраны пользователем.

foreach($postdata as $key => $value) 
{ 
    $data .= $key . '=' . $value . '&';
}

if ($method == 'POST') {

    // Set headers
    $headers = array('http' => array(
            'method' => $method,
            'header' => "accept-language: en\r\n" . 
            "Host: $host\r\n" .
            "Referer: $url\r\n" .
            "Content-Type: application/x-www-form-urlencoded\r\n",
            'content' => $data));

    // Send request and retreive response
    $context = stream_context_create($headers);
    $fp = fopen($url, 'rb', false, $context);
    fpassthru($fp);
    fclose($fp);

} else if ($method == 'GET') {

    // Set headers
    $headers = array('http' => array(
            'method' => $method,
            'header' => "accept-language: en\r\n" . 
            "Host: $host\r\n" .
            "Referer: $url\r\n" .
            "Content-Type: application/x-www-form-urlencoded\r\n"));

    // Append url
    $url .= '?' . $data;

    // Send request and retreive response
    $context = stream_context_create($headers);
    $fp = fopen($url, 'rb', false, $context);
    fpassthru($fp);
    fclose($fp);

} else {
    echo 'Invalid method.';
}

В большинстве случаев это работает нормально, однако некоторые сайты возвращают 403 Forbidden якобы потому, что им не нравятся запросы fopen(). Есть ли способ обойти это? Если вместо этого я использую cURL, это предотвратит ошибку 403? И если да, то каким будет способ cURL сделать вышеизложенное? Спасибо.


person Joey    schedule 04.03.2012    source источник
comment
403 имеет мало общего с fopen и cURL, а скорее с тем, что ему не нравится ваш вызов в целом. Это может быть связано с отсутствием реферера (или реферера, который ему не нравится, вызывая защиту от хотлинков). Это также может означать, что URL-адрес, к которому вы пытаетесь получить доступ, защищен паролем, просто запрещен или требует определенного файла cookie сеанса. Это действительно варьируется от сайта к сайту, поэтому нет общего ответа. Сказав это, я бы определенно предложил использовать cuRL в целом (а не очищать сайты, которые не хотят).   -  person Morgon    schedule 05.03.2012
comment
Я не думаю, что это реферер, потому что я устанавливаю его на запрошенный URL-адрес. И это не что-то другое. Однако я рассмотрю решение cURL. А я сайты не паршу :)   -  person Joey    schedule 05.03.2012


Ответы (1)


Вы можете убедиться, что вы передаете USER-AGENT вместе с вашими заголовками. Я работал над проектами, которые требовали от нас входа в удаленные системы, чтобы мы могли получать данные, но в некоторых из этих систем, если бы мы не передали действительный пользовательский агент, мы не получили бы доступ, даже если учетные данные для входа были установить правильно.

person Mike Purcell    schedule 04.03.2012