HTTP 请求失败! HTTP/1.1 505 HTTP 版本不支持错误

Posted

技术标签:

【中文标题】HTTP 请求失败! HTTP/1.1 505 HTTP 版本不支持错误【英文标题】:HTTP request failed! HTTP/1.1 505 HTTP Version Not Supported error 【发布时间】:2011-02-14 23:46:08 【问题描述】:

我正在尝试使用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 版本造成的,但我不知道为什么会发生这种情况。

非常感谢任何帮助。提前致谢

【问题讨论】:

我在使用“curl”时也收到同样的错误。 尝试用 '%24' 替换你的 '$'。这可能不是导致您的问题的原因,但您应该正确地对字符进行 urlencode。 $ 实际上是用于变量的。我找到了导致错误的原因,它是 urlencoding。我之前没有注意到它,因为脚本更早地工作了,经过一些编辑后我错过了这个功能。感谢所有试图提供帮助的人......以及您的回复确实提供了信息。 你能正确发布工作代码吗? @Prakash 检查我自己的答案。 【参考方案1】:

我发现了问题,这是一个简单的编码错误——缺少 url 编码。

我一开始没有注意到是因为在我做一些编辑之前代码是好的,我在调用服务器之前错过了urlencode()函数,导致url中有空格。

这似乎是大多数人发生此错误的原因。因此,如果您遇到这种情况,请对所有可能在其用作 URL 参数的值中包含空格的变量使用 urlencode()。因此,在我的问题中,固定代码将如下所示:

$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);

另外,感谢您的所有时间和回复,这些都是信息性的。

【讨论】:

我有一个 url,并且没有在它的后半部分交换空格。这样做了,它为我修好了。【参考方案2】:

您可以 create a stream context 将 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);

顺便说一句:不要忘记使用 urlencode 正确转义 URI 参数值。

【讨论】:

【参考方案3】:

我遇到了同样的问题,在我的情况下,罪魁祸首是请求 URL 末尾的错误换行符/CRLF 字符,urlencode() 没有捕捉到它(或者它可能确实对其进行了编码,但它仍然会导致服务器产生错误)。一旦我发现问题,请求就会再次开始工作,即使没有流上下文选项。

希望这对其他人有所帮助。

【讨论】:

【参考方案4】:

你能嗅出电线上发生了什么吗?查看在线发送的 HTTP 请求的格式会很有帮助。

如果没有看到,我最好的猜测是服务器没有很好地实现,并且正在拒绝 HTTP/1.1 请求。尝试在 Curl 上设置 --http1.0 看看会发生什么...

【讨论】:

能否请您告诉我如何查看 HTTP 请求的格式..? 您不能使用 file_get_contents 这样做。这是一种非常脑残的 fetch 方法,它使您无法控制 HTTP 请求的发出方式。不返回任何标题,您只能执行简单的“GET”。要获取标头和/或执行其他 HTTP 请求方法,您必须使用 CURL【参考方案5】:

有时我们仍然会出错

file_get_contents($api);

在这种情况下,试试这个:

fopen($api,"r");

【讨论】:

【参考方案6】:

我也遇到了同样的问题.. 后来我发现,在从 mysql 中检索结果时, Limit $count , $count 是 -ve。修复网址工作正常。 只有 url 有问题,不是 file_get_contents 或 http 版本问题..

【讨论】:

以上是关于HTTP 请求失败! HTTP/1.1 505 HTTP 版本不支持错误的主要内容,如果未能解决你的问题,请参考以下文章

HTTP 请求失败! HTTP/1.1 400 错误请求

Telegram + PHP (Windows 7):无法打开流:HTTP 请求失败! HTTP/1.1 404 未找到

file_get_contents - 无法打开流:HTTP 请求失败! HTTP/1.1 404 未找到

Http基础知识

NodeJs 中的 http、https 和 http2

http常用状态码,从100到505