wget错误400从PHP,200从命令行

时间:2018-11-07 20:09:46

标签: php wget

在命令行中(通过服务器上的SSH),该方法有效:

wget "https://www.example.com/script?paramA=1234&paramB=ABCD"

从同一服务器上的PHP:

$url = "https://www.example.com/script?paramA=1234&paramB=ABCD";
exec("/usr/bin/wget $url");

我得到:

HTTP request sent, awaiting response... 400 Bad Request
2018-11-07 15:01:21 ERROR 400: Bad Request.

这是怎么回事?

1 个答案:

答案 0 :(得分:2)

让我们看看两者之间有何不同?

wget "https://www.example.com/script?paramA=1234&paramB=ABCD"

VS

$url = "https://www.example.com/script?paramA=1234&paramB=ABCD";
exec("/usr/bin/wget $url");

让我们来看看您的PHP代码: 如果打印回显$url,您将得到:

https://www.example.com/script?paramA=1234&paramB=ABCD

从字面上看。

那么,您的exec调用中发生了什么呢? 如果您回显"/usr/bin/wget $url",您将得到:

/usr/bin/wget https://www.example.com/script?paramA=1234&paramB=ABCD

从字面上看。 现在

有什么区别
wget "https://www.example.com/script?paramA=1234&paramB=ABCD"

/usr/bin/wget https://www.example.com/script?paramA=1234&paramB=ABCD

当然有路径:/usr/bin,但是...如果尝试一下,您会发现这不是问题...

还有什么?引号。 shell命令中的url用引号引起来,而不是引号引起来,由PHP代码生成。

正如@ArtisticPhoenix在评论中提到的那样,您可以在$ url变量上使用php函数escapeshellarg()。它将在网址周围加上引号(并确保您的字符串保持字符串形式,例如,防止注入),并且您的命令应运行正常。

如果您想知道这里发生了什么,那是因为您的URL中的&符号是由执行两个命令而不是一个命令的控制台解析的。您的url调用(缺少paramB,而另一个命令paramB=ABCD在您的shell中创建了一个变量。您可以通过键入echo $paramB来看到它,这将在控制台中打印ABCD。调用可能依赖于paramB出现,因此,返回400错误。

希望这会有所帮助。祝你好运。