代码之家  ›  专栏  ›  技术社区  ›  Timothée Jeannin

CURL不适用于参数中带有大括号的URL

  •  1
  • Timothée Jeannin  · 技术社区  · 6 年前

    有些带括号的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 Developer工具,我有:

    Chrome dev tool results

    CURL接收404而不是302重定向。这是否与CURL可能是URL编码括号的事实有关?我不知道这里出了什么问题。

    1 回复  |  直到 5 年前
        1
  •  4
  •   Aurélien Gasser    6 年前

    花括号是 unsafe in URLs

    换言之,它会转变 { %7B } &7D .

    -d 相反 自从 将请求更改为帖子,您还需要使用 -G 强制请求成为GET。

    因此,与其这样做

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

    你能行

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

    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
    
        2
  •  2
  •   user144437    5 年前

    使用此标志(从 man curl ):

    -g/--globoff
                  This  option  switches  off  the "URL globbing parser". When you set this option, you can
                  specify URLs that contain the letters {}[] without having them being interpreted by  curl
                  itself.  Note  that  these  letters  are not normal legal URL contents but they should be
                  encoded according to the URI standard.