【问题标题】:Cookie issue in CURL (PHP) - Cookie information not attached in CURL headersCURL (PHP) 中的 Cookie 问题 - CURL 标头中未附加 Cookie 信息
【发布时间】:2017-01-31 08:16:02
【问题描述】:

我有这个代码

<?php
    $mLoginUrl = "https://www.test.com/login";
    $mCookieFile = dirname(__FILE__).'/tmpCookies/cookie'.rand().'.txt';

    define('USER_AGENT', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36');
    define('COOKIE_FILE', $mCookieFile);
    define('LOGIN_FORM_URL', $mLoginUrl);
    define('LOGIN_ACTION_URL', $mLoginUrl);

    $postValues = array(
        'user[email]' => "mymail@email.com",
        'user[password]' => "mypassword"
    );

    $headers = Array(
                "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
                "Cache-Control: max-age=0",
                "Connection: keep-alive",
                "Keep-Alive: 300",
                "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7",
                "Accept-Language: en-us,en;q=0.5",
                "Pragma: "
            );

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_VERBOSE, TRUE);
    curl_setopt($curl, CURLOPT_URL, LOGIN_ACTION_URL);
    curl_setopt($curl, CURLOPT_POST, TRUE);
    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($postValues));
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($curl, CURLOPT_COOKIEJAR, COOKIE_FILE);
    curl_setopt($curl, CURLOPT_COOKIEFILE, COOKIE_FILE);
    curl_setopt($curl, CURLOPT_USERAGENT, USER_AGENT);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl, CURLOPT_REFERER, LOGIN_FORM_URL);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($curl, CURLOPT_HTTPHEADER,$headers) ;
    curl_setopt($curl, CURLINFO_HEADER_OUT, TRUE);
    $res = curl_exec($curl);
    $info = curl_getinfo($curl);
    print_r($info['request_header']);
    exit;
?> 

这在我的本地计算机和我的一台服务器上运行良好,并显示以下输出

GET / HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36
Host: www.test.com
Referer: https://www.test.com/login
Cookie: _property_session=WjROWEYvTHNYaE5Zb29jVk04WGM0Z3FybmhmY1ZIeVdBc2N6d2N3UmViaXlZdFNhR1dSbUN4QVh6aFFSRjFPYktybmdnRGlXNG0yWWcremEzcklKTnE1ZE1lTTM0eUQrSG90SVhRRzhvYW5rWmFQTVhBMjVCWjBtb1FSc0RrTEh2RjhHSFI3aHkwa3U4N3Y3czJhTzJuN2ZGbWRRN0Nra2Z6OTR4aHhvVG42bVVRS3kwTExUL1hMN2JoZ0xRd2g3VVdIMC81cGhLQzJjOTJvc2RYajIwakE0VjZqRnhTeHBleFltTGF4Z3hpUGJEb0E3Nlo2S3BwMElqNnVkaWhDVS0tc0pCRlozSVE5bXRHQXlHWE1IbTl4UT09--67cf6e056b84b4cae4d275507f544927802eb78d
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Cache-Control: max-age=0
Connection: keep-aliveKeep-Alive: 300 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Accept-Language: en-us,en;q=0.5 

这意味着cookie被创建并附加在CURL的标题中(正如我们在上面的CURL标题打印中看到的那样。)cookie文件也在提到的位置创建。

但在我的一台服务器上,代码无法按预期工作并给出以下输出

POST /users/sign_in? HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36 Host: www.test.com Referer: https://www.test.com/login Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Cache-Control: max-age=0 Connection: keep-alive Keep-Alive: 300 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Accept-Language: en-us,en;q=0.5 Content-Length: 76 Content-Type: application/x-www-form-urlencoded 

表示 cookie 信息未附加在 CURL 的标头中。我已经检查过这个(有问题的)服务器中也创建了 cookie 文件,并且有 cookie 内容,但 cookie 内容仍然不包含在 CURL 标头中。提到的临时 cookie 目录对所有用户都具有完全的权限/权限 (777)。

在有问题的服务器上,PHP 版本为 5.4.19,CURL 版本为 7.19.7。

如果有人可以帮忙?我已经尝试了在互联网上找到的所有解决方案。

提前致谢。

【问题讨论】:

  • 通过提及 CatalinB 建议的静态文件名,我可以在标题中获取 Cookie 信息,但我仍然无法登录其他网站。虽然结果略有不同。 start 中有 POST /login? 而不是 GET。这也可以在我的主要问题中指出,一个有 GET,另一个有 POST。为什么会这样?有什么帮助吗?请

标签: php curl cookies header


【解决方案1】:

$mCookieFile = dirname(__FILE__).'/tmpCookies/cookie'.rand().'.txt';

删除 rand() ... 成为静态文件

【讨论】:

  • 谢谢。有效。我的意思是现在提到静态文件名后附加了Cookie信息,但我仍然无法登录其他网站。虽然结果略有不同。 start 中有 POST /login? 而不是 GET。这也可以在我的主要问题中指出,一个是 GET,另一个是 POST。为什么会这样?有什么帮助吗?请
  • 你的代码发出一个 post 请求并尝试从 chrome 登录并在 Chrome 中查看 - 检查 -> 网络发送了哪些参数
  • 我已将 Chrome->Inspect->Network 上传到以下图片。看看你能不能帮忙。如果代码相同,为什么一个是 GET 而另一个是 POST? GET 正在工作 imgur.com/a/Tfeka
【解决方案2】:

感谢大家的帮助。我已经解决了问题。问题是 open_basedir 路径。我在解决问题的服务器上将此设置为“无”。

【讨论】:

    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 2014-11-14
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多