Wget ошибка 400 из PHP, 200 из командной строки - PullRequest
0 голосов
/ 07 ноября 2018

Из командной строки (через 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 голосов
/ 07 ноября 2018

Посмотрим, чем они отличаются?

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, но ... Если вы попробуете его, вы обнаружите, что это не ваша проблема ...

Что еще? Цитаты. URL в вашей команде оболочки заключен в кавычки, а не в тот, который сгенерирован вашим PHP-кодом.

Как упомянуто @ArtisticPhoenix в комментариях, вы можете использовать функцию php escapeshellarg() в переменной $ url. Он добавит кавычки вокруг вашего URL (а также убедитесь, что ваша строка остается строкой, например, для предотвращения внедрения), и ваша команда должна работать нормально.

Если вы хотите знать, что здесь происходит, значит, что символ & в вашем URL анализируется консолью, которая выполняет две команды вместо одной. Ваш url-вызов (при отсутствии paramB и другой команде paramB=ABCD, которая создает переменную в вашей оболочке. Вы можете увидеть это, набрав echo $paramB, который выведет ABCD в вашей консоли. Вызываемый API, вероятно, опирается на paramB чтобы присутствовать, следовательно, возвращая вам ошибку 400.

Надеюсь, это поможет. Удачи.

...