代码之家  ›  专栏  ›  技术社区  ›  Trygve

wget错误400来自PHP,200来自命令行

  •  0
  • Trygve  · 技术社区  · 7 年前

    从命令行(通过服务器上的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 回复  |  直到 7 年前
        1
  •  2
  •   Lou    7 年前

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

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

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

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

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

    那么,你的主管电话是怎么回事? 如果你回音 "/usr/bin/wget $url"

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

    真的。 现在这两者有什么区别

    /usr/bin 但是。。。如果你尝试一下,你会发现那不是你的问题。。。

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

    正如@artisticpenix在评论中提到的,您可以使用php函数 escapeshellarg() 在$url变量上。它会在你的url周围加上引号(并且确保你的字符串是一个字符串,以防止注入,例如),你的命令应该运行良好。

    如果你想知道这里发生了什么 & url中的符号由控制台解析,控制台执行两个命令而不是一个命令。您的url呼叫(使用 paramB paramB=ABCD 在shell中创建一个变量。你可以通过打字看到它 echo $paramB 帕拉姆 因此,返回400错误。