cURL works from Terminal, but not from PHP

后端 未结 4 2168
深忆病人
深忆病人 2021-02-19 00:56

I\'m running into a rather strange issue.

I\'m trying to log into a remote moodle install using curl from PHP.

I have a curl command, which works perfectly in th

4条回答
  •  轮回少年
    2021-02-19 01:46

    Use http_build_query on the $data array before passing to curl to avoid Content-Type: application/x-www-form-urlencoded; boundary=---. This also ensures to encode any special characters from the password.

    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
    

    Reshape your curl requests as follows:

    Make a GET request to the login page with pointing a cookie file at $cookies = '/tmp/some/dir/xyz.cookie.txt'. Make sure using full path for cookie name. And then close the curl handle. This will store the cookie in cookie file.

    $creq = curl_init();
    curl_setopt_array($creq, array(
      CURLOPT_URL => 'http://moodle.tsrs.org/login/index.php',
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => '',
      CURLINFO_HEADER_OUT => true,
      CURLOPT_HTTPHEADER => $headers,
      CURLOPT_FOLLOWLOCATION => false,
      CURLOPT_COOKIEJAR => $cookies // save cookie
    ));
    $output = curl_exec($creq);
    curl_close($creq);
    

    Now make the POST request with second curl request. This time point the same cookie file with COOKIEFILE option.

    $creq = curl_init();
    curl_setopt_array($creq, array(
      CURLOPT_URL => 'http://moodle.tsrs.org/login/index.php',
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_POST => true,
      CURLOPT_ENCODING => '',
      CURLINFO_HEADER_OUT => true,
      CURLOPT_POSTFIELDS => http_build_query ($data),
      CURLOPT_HTTPHEADER => $headers,
      CURLOPT_FOLLOWLOCATION => false,
      CURLOPT_COOKIEJAR => $cookies, // save cookie
      CURLOPT_COOKIEFILE => $cookies // load cookie
    );
    $output = curl_exec($creq);
    curl_close($creq);
    

    It can happen sometimes the server look for the cookie when a login request made (to ensure that the request came after visiting the login page).

提交回复
热议问题