Wget ошибка 400 из PHP, 200 из командной строки

голоса
0

Из командной строки (через 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.

Что здесь происходит?

Задан 07/11/2018 в 20:09
источник пользователем
На других языках...                            


1 ответов

голоса
2

Давайте посмотрим, чем же отличается между этими двумя?

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 код: Если вы печатаете эхо $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

В прямом смысле. Теперь в чем разница между

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 в вашей команде оболочки обернут в кавычки, в то время как это не так, в одной генерируемой РНР кода.

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

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

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

Ответил 07/11/2018 в 20:56
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more