HTTP запрос не удался! HTTP / 1.1 505 HTTP версия не поддерживается ошибка

Я пытаюсь использовать file_get_contents() чтобы получить ответ от сервера, и эта ошибка была обнаружена. Может кто подскажет в чем причина и как ее исправить? Часть кода:

$api = "http://smpp5.routesms.com:8080/bulksms/sendsms?username=$username&password=$password&source=$source&destination=$destin&dlr=$dlr&type=$type&message=$message";
$resp = file_get_contents($api);

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

любая помощь очень ценится. Заранее спасибо

6 ответов


Я нашел проблему, и это была простая ошибка кодирования-отсутствует кодировка url.

причина, по которой я не заметил это сначала, заключалась в том, что код был в порядке, прежде чем я сделал некоторое редактирование, и я пропустил urlencode() функция перед вызовом сервера, которая вызвала пробел в url-адресе.

Это, похоже, причина, по которой эта ошибка возникает для большинства людей. Поэтому, если вы столкнетесь с этим, используйте urlencode() по всем переменным, которые могут содержать пробел в значение, используемое в качестве параметров URL. Поэтому в случае в моем вопросе фиксированный код будет выглядеть так:

$api = "http://smpp5.routesms.com:8080/bulksms/sendsms?username=$username&password=$password&source=$source&destination=$destin&dlr=$dlr&type=$type&message=" . urlencode($message);
$resp = file_get_contents($api);

кроме того, Спасибо за все ваше время и ответы, они были информационными.


вы можете создать контекст потока С версией HTTP, установленной в 1.0, и используйте этот контекст с file_get_contents:

$options = array(
    'http' => array(
        'protocol_version' => '1.0',
        'method' => 'GET'
    )
);
$context = stream_context_create($options);
$api = "http://smpp5.routesms.com:8080/bulksms/sendsms?username=$username&password=$password&source=$source&destination=$destin&dlr=$dlr&type=$type&message=$message";
$resp = file_get_contents($api, false, $context);

кстати: не забудьте правильно избежать значений аргумента URI с помощью urlencode.


вы можете понюхать, что происходит на проводе? Видеть формат HTTP-запроса, когда он выходит на провод, очень помогло бы.

Не видя этого, я бы предположил, что сервер не очень хорошо реализован и отклоняет запрос HTTP/1.1. Попробуйте установить --http1.0 на Curl и посмотреть, что произойдет...


я столкнулся с той же проблемой, и в моем случае виновником был ошибочный символ новой строки/CRLF в конце URL-адреса запроса, который не попадает в urlencode() (или, может быть, он кодирует его, но он по-прежнему заставляет сервер производить ошибку). Как только я нашел проблему, запросы снова начали работать, даже без параметров контекста потока.

надеюсь, это поможет другим.


некоторое время мы еще получаем ошибку

file_get_contents($api);

в этом случае попробуйте следующее:

fopen($api,"r");

Я также столкнулся с этой же проблемой.. позже я обнаружил, что при получении результатов из mysql ограничьте $ count , $граф -ве. исправление того, что url работал нормально. Существует некоторая проблема только в url-адресе, а не проблема с версией file_get_contents или http..