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

15

我正在尝试使用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' 时也收到了相同的错误。 - shyam
尝试将您的“$”替换为“%24”。这可能不是导致问题的原因,但您应该正确地对字符进行urlencode编码。 - Kylar
$符号实际上是用于变量的。我已经找到了导致错误的原因,那就是URL编码。之前我没有注意到它,因为在稍微编辑一下脚本后,脚本仍然能够正常工作,而我错过了一个函数。感谢所有试图帮助我的人...你们的回复确实很有信息量。 - shyam
你可以把可运行的代码适当地张贴出来吗? - LIGHT
@Prakash 检查我的回答。 - shyam
@shyam 我还是遇到了一些错误,但是找到了解决方案。请查看我的答案。 - LIGHT
6个回答

35
我发现了问题,原来是个简单的编码错误——缺少 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);

同时,感谢您花费的所有时间和回复,它们都很有信息价值。


我有一个给定的URL,但是在后面的部分没有交换空格。我这样做了,问题就解决了。 - Danny Staple

10

你可以创建一个流上下文,将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参数值。


1

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

希望这能帮助其他人。


0

有时候我们仍然会遇到错误

file_get_contents($api);

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

fopen($api,"r");

0
你能嗅探到网络上正在发生的事情吗?在请求通过网络时查看HTTP请求的格式会很有帮助。
如果没有看到它,我最好的猜测是服务器实现不好,并且拒绝了HTTP/1.1请求。尝试在Curl上设置--http1.0并查看会发生什么...

请问您如何查看HTTP请求的格式? - shyam
你不能使用file_get_contents来实现。它是一种极其愚蠢的获取方法,无法控制HTTP请求的方式。没有返回头,并且你只能进行简单的“GET”操作。如果要获取头文件和/或执行其他HTTP请求方法,则必须使用CURL。 - Marc B

0

我也遇到了同样的问题...后来我发现在从mysql检索结果时,Limit $count, $count是负数。修复后,URL正常工作了。 只有URL存在问题,而不是file_get_contents或http版本问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接