PHP中的wget错误400,命令行中的wget错误200

PHP中的wget错误400,命令行中的wget错误200,php,wget,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

从命令行(通过服务器上的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.

这是怎么回事?

让我们看看,这两者有什么不同

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

让我们看看您的PHP代码: 如果您打印echo
$url
,您将获得:

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

那么,你的主管电话是怎么回事? 如果您回显
“/usr/bin/wget$url”
,您将得到:

https://www.example.com/script?paramA=1234&paramB=ABCD
/usr/bin/wget https://www.example.com/script?paramA=1234&paramB=ABCD
真的。 那么这两者之间有什么区别呢

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

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

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

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

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


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

让我们看看,这两者有什么不同

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

让我们看看您的PHP代码: 如果您打印echo
$url
,您将获得:

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

那么,你的主管电话是怎么回事? 如果您回显
“/usr/bin/wget$url”
,您将得到:

https://www.example.com/script?paramA=1234&paramB=ABCD
/usr/bin/wget https://www.example.com/script?paramA=1234&paramB=ABCD
真的。 那么这两者之间有什么区别呢

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

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

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

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

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


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

为什么要使用exec/wget而不是像curl这样的东西?我猜这是因为exec内部的url不像命令行那样被引用。你必须添加quotes@aynber-是首选的方法。否则,它会说这是一个很好的可能性。为什么您要使用exec/wget比如curl?我猜这是因为exec内部的url没有像命令行那样被引用。您必须添加quotes@aynber-是最好的方法。否则,它会说这是一个很好的可能性。