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 版本不支持错误的主要内容,如果未能解决你的问题,请参考以下文章
Telegram + PHP (Windows 7):无法打开流:HTTP 请求失败! HTTP/1.1 404 未找到