2017-01-23 2 views
0

Я получаю 403 ошибки при использовании file_get_contents(),Как обращаться с ошибкой 403 в файле_get_contents()?

Я хочу, чтобы обработать эту ошибку, как это,

if(required_function(file_get_contents($url))){ //detects there is a 403 
    error 
// do some special set of tasks 
}else{ 
    //run normally 
} 

Я попытался прочитать ошибку, так как URL показывает ошибку, когда я вставленный в браузере , но не попадает в file_get_contents(), поэтому я потерпел неудачу. Я не думаю, что изменение пользовательского агента будет работать, потому что системы все еще могут обнаружить это сценарий, поэтому я понял, могу ли я обнаружить ошибку 403, сценарий не будет аварийно завершен.

любые идеи?

, пожалуйста, помогите, я новичок в программировании. большое спасибо.

+0

Я считаю, что у вас есть опечатка в required_function у забыл в п –

+0

исправленный, это функция мне нужно от вас, ребята :) если это возможно –

+0

О порядке я лично никогда не обрабатываются 403 ... Но я знаю, что вы можете обрабатывать 404 из .htaccess, перенаправляете ли вы на пользовательскую страницу ... Может быть, попробуйте? –

ответ

0

Лично я предлагаю вам использовать cURL вместо file_get_contents. file_get_contents отлично подходит для базовых запросов GET, ориентированных на контент. Но заголовок, метод HTTP-запроса, тайм-аут, перенаправления и другие важные вещи не имеют для этого значения.

Тем не менее, для определения коды состояния (403, 200, 500 и т.д.), вы можете использовать get_headers() вызова или $ http_response_header автоматических назначен переменных.

$ http_response_header это предопределенная переменная и она обновляется на каждом file_get_contents вызова.

Следующий код может предоставить вам код статуса (403, 200 и т. Д.) Напрямую.

preg_match("#HTTP/[0-9\.]+\s+([0-9]+)#", $http_response_header[0], $match); 
$statusCode = intval($match[1]); 

Для получения дополнительной информации и содержание переменной, пожалуйста, проверьте официальную документацию

$http_response_header — HTTP response headers

get_headers — Fetches all the headers sent by the server in response to a HTTP request

(Better Alternative) cURL

Предупреждение о $ http_response_header, (from php.net)

Обратите внимание, что HTTP обертка имеет жесткий предел 1024 символов для строк заголовка. Любой полученный HTTP-заголовок, который длиннее этого, будет проигнорирован и не появится в $ http_response_header. Расширение cURL не имеет этого предела.

+0

Я согласен с этим ответом, попробуйте это сначала –

+0

if (get_headers ($ url) [0] == "HTTP/1.1 403 FORBIDDEN") будет работать правильно? –

+0

спасибо @ TuğcaEker –

0

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

В: Как делать POST в PHP, не используя cURL?
A: Используйте файл_get_contents().

В: Как заставить file_get_contents() не жаловаться на HTTP-статус ошибки?
A: Установить ingore_errors => TRUE в параметрах, переданных в file_get_contents().

В: Как получить статус http в ответ?
A: После вызова file_get_contents() оценить $ http_response_header

Вопрос: Как получить тело ответа даже для кода ответа об ошибке HTTP?
A: Установить ignore_errors => TRUE и file_get_contents() вернет тело.

Вот пример кода:

$reqBody = '{"description":"test"}'; 
$opts = array('http' => 
    array(
     'method' => 'POST', 
     'header' => "Content-Type: application/json\r\n", 
     'ignore_errors' => TRUE, 
     'content' => $reqBody 
    ) 
); 

$context = stream_context_create($opts); 
$url = 'http://mysite'; 
// with ignore_errors=true, file_get_contents() won't complain 
$respBody = file_get_contents($url, false, $context); 

// evaluate the response header, the way you want. 
// In particular it contains http status code for response 
var_dump($http_response_header); 

// with ignore_errors=true, you get respBody even for bad http response code 
echo $respBody;