PHP中的wget错误400,命令行中的wget错误200
从命令行(通过服务器上的SSH)执行以下操作:PHP中的wget错误400,命令行中的wget错误200,php,wget,Php,Wget,从命令行(通过服务器上的SSH)执行以下操作: wget "https://www.example.com/script?paramA=1234¶mB=ABCD" 从同一服务器上的PHP: $url = "https://www.example.com/script?paramA=1234¶mB=ABCD"; exec("/usr/bin/wget $url"); 我得到: HTTP request sent, awaiting response... 400
wget "https://www.example.com/script?paramA=1234¶mB=ABCD"
从同一服务器上的PHP:
$url = "https://www.example.com/script?paramA=1234¶mB=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¶mB=ABCD"
VS
让我们看看您的PHP代码:
如果您打印echo$url
,您将获得:
https://www.example.com/script?paramA=1234¶mB=ABCD
/usr/bin/wget https://www.example.com/script?paramA=1234¶mB=ABCD
真的
那么,你的主管电话是怎么回事?
如果您回显“/usr/bin/wget$url”
,您将得到:
https://www.example.com/script?paramA=1234¶mB=ABCD
/usr/bin/wget https://www.example.com/script?paramA=1234¶mB=ABCD
真的。
那么这两者之间有什么区别呢
wget "https://www.example.com/script?paramA=1234¶mB=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¶mB=ABCD"
VS
让我们看看您的PHP代码:
如果您打印echo$url
,您将获得:
https://www.example.com/script?paramA=1234¶mB=ABCD
/usr/bin/wget https://www.example.com/script?paramA=1234¶mB=ABCD
真的
那么,你的主管电话是怎么回事?
如果您回显“/usr/bin/wget$url”
,您将得到:
https://www.example.com/script?paramA=1234¶mB=ABCD
/usr/bin/wget https://www.example.com/script?paramA=1234¶mB=ABCD
真的。
那么这两者之间有什么区别呢
wget "https://www.example.com/script?paramA=1234¶mB=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-是最好的方法。否则,它会说这是一个很好的可能性。