CURL не работает с URL-адресами с фигурными скобками в параметрах - PullRequest
0 голосов
/ 13 декабря 2018

Некоторые URL с квадратными скобками не работают с CURL, но работают в Chrome и Firefox.

Например, этот URL: https://rdtrkr.com/mg.php?voluum_id=d51b17bc-c537-4f3e-9879-2e373341ae5a&widget_id={widget_id}&campaign_id={campaign_id}&teaser_id={teaser_id}&geo={geo}&img=guy18.jpg&txt=german&lp=de&click_price={click_price}&click_id={click_id}&{click_id} работает в Chrome и Firefox, но при вызове с CURL даетошибка 404.

curl  \
-H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36" \
-v "https://rdtrkr.com/mg.php?voluum_id=d51b17bc-c537-4f3e-9879-2e373341ae5a&widget_id={widget_id}&campaign_id={campaign_id}&teaser_id={teaser_id}&geo={geo}&img=guy18.jpg&txt=german&lp=de&click_price={click_price}&click_id={click_id}&{click_id}"

Производит результат:

< HTTP/2 404 
< server: nginx
< date: Thu, 13 Dec 2018 16:53:45 GMT
< content-type: text/html; charset=UTF-8
< content-length: 0

Но с инструментами хром-девелопера в режиме "Сохранить журнал" у меня есть:

Chrome dev tool results

CURL получает 404 вместо 302 перенаправления.Связано ли это с тем, что CURL может быть скобками для кодирования URL?Я не знаю, что здесь происходит не так.

ps: я не владелец веб-сайта, который я использую в примере.

1 Ответ

0 голосов
/ 13 декабря 2018

Вьющиеся скобки небезопасны в URL .cURL (в отличие от Google Chrome) пытается оказать вам услугу и автоматически кодирует URL.

Другими словами, он преобразует { в %7B и } в &7D.

Чтобы предотвратить такое поведение, вы можете передать параметры строки запроса, используя вместо этого -d. Поскольку -d изменяет запрос на POST, вам также нужно будет использовать -G для принудительного вызовазапрос на получение GET.

Поэтому вместо выполнения

curl "http://example.com?param1=xxx&param2=yyy"

вы можете сделать

curl "http://example.com" -G -d "param1=xxx&param2=yyy"

В вашем конкретном случае, по какой-то причине, веб-сервер вытаргетинг все равно вернется на 404, если вы не укажете заголовок Accept-Language:

curl -v "http://rdtrkr.com/mg.php" \
     -G -d "voluum_id=d51b17bc-c537-4f3e-9879-2e373341ae5a&widget_id={widget_id}&campaign_id={campaign_id}&teaser_id={teaser_id}&geo={geo}&img=guy18.jpg&txt=german&lp=de&click_price={click_price}&click_id={click_id}&{click_id}" \
     -H "Accept-Language: en-US,en;q=0.9,fr;q=0.8,ru;q=0.7,es;q=0.6"

дает

*   Trying 34.192.193.118...
* Connected to rdtrkr.com (34.192.193.118) port 80 (#0)
> GET /mg.php?voluum_id=d51b17bc-c537-4f3e-9879-2e373341ae5a&widget_id={widget_id}&campaign_id={campaign_id}&teaser_id={teaser_id}&geo={geo}&img=guy18.jpg&txt=german&lp=de&click_price={click_price}&click_id={click_id}&{click_id} HTTP/1.1
> Host: rdtrkr.com
> User-Agent: curl/7.47.0
> Accept: */*
> Accept-Language: en-US,en;q=0.9,fr;q=0.8,ru;q=0.7,es;q=0.6
>
< HTTP/1.1 302 Found
< Server: nginx
< Date: Thu, 13 Dec 2018 17:39:18 GMT
< Content-Type: text/html; charset=UTF-8
< Content-Length: 0
< Connection: keep-alive
< Location: https://rotronica-premarity.com/d51b17bc-c537-4f3e-9879-2e373341ae5a?widget_id={widget_id}&campaign_id={campaign_id}&teaser_id={teaser_id}&geo={geo}&img=guy18.jpg&txt=german&lp=de&click_price={click_price}&click_id={click_id}
<
* Connection #0 to host rdtrkr.com left intact
...