在命令行中(通过服务器上的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 Bad Request
2018-11-07 15:01:21 ERROR 400: Bad Request.
这是怎么回事?
答案 0 :(得分:2)
让我们看看两者之间有何不同?
wget "https://www.example.com/script?paramA=1234¶mB=ABCD"
VS
$url = "https://www.example.com/script?paramA=1234¶mB=ABCD";
exec("/usr/bin/wget $url");
让我们来看看您的PHP代码:
如果打印回显$url
,您将得到:
https://www.example.com/script?paramA=1234¶mB=ABCD
从字面上看。
那么,您的exec调用中发生了什么呢?
如果您回显"/usr/bin/wget $url"
,您将得到:
/usr/bin/wget https://www.example.com/script?paramA=1234¶mB=ABCD
从字面上看。 现在
有什么区别wget "https://www.example.com/script?paramA=1234¶mB=ABCD"
和
/usr/bin/wget https://www.example.com/script?paramA=1234¶mB=ABCD
当然有路径:/usr/bin
,但是...如果尝试一下,您会发现这不是问题...
还有什么?引号。 shell命令中的url用引号引起来,而不是引号引起来,由PHP代码生成。
正如@ArtisticPhoenix在评论中提到的那样,您可以在$ url变量上使用php函数escapeshellarg()
。它将在网址周围加上引号(并确保您的字符串保持字符串形式,例如,防止注入),并且您的命令应运行正常。
如果您想知道这里发生了什么,那是因为您的URL中的&
符号是由执行两个命令而不是一个命令的控制台解析的。您的url调用(缺少paramB
,而另一个命令paramB=ABCD
在您的shell中创建了一个变量。您可以通过键入echo $paramB
来看到它,这将在控制台中打印ABCD。调用可能依赖于paramB
出现,因此,返回400错误。
希望这会有所帮助。祝你好运。