【问题标题】:cURL returns 302, whereas a browser returns 200cURL 返回 302,而浏览器返回 200
【发布时间】:2015-05-15 07:26:02
【问题描述】:

我有一个脚本,它使用大量 cURL 登录站点并提交一系列表单,但是由于 cURL 请求返​​回 302 并重定向到块/端点页面,这最近停止工作。如果我在浏览器上执行相同的操作,则没有重定向,只有 200 OK。

我的 cURL 正在使用登录过程返回的 cookie,所以我不认为会话正在被丢弃。

我最初认为缺少 CSRF 令牌(某种形式),给定重定向位置,并且该过程中的后续表单(使用浏览器)包含隐藏的 CSRF 令牌字段,但 URL 不需要发布数据。

cURL 和响应如下:

curl_setopt($ch, CURLOPT_URL, 'https://*******.********.co.uk/Dispatcher?menuid=pos_home'); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_HEADER, 0);
$content = curl_exec ($ch);
echo "CURL INFO : <BR/><pre>" ;
print_r(curl_getinfo($ch));

返回:

Array
(
[url] => https://*******.********.co.uk/Dispatcher?menuid=pos_home
[content_type] => text/html
[http_code] => 302
[header_size] => 253
[request_size] => 332
[filetime] => -1
[ssl_verify_result] => 20
[redirect_count] => 0
[total_time] => 0.142718
[namelookup_time] => 2.4E-5
[connect_time] => 2.4E-5
[pretransfer_time] => 9.0E-5
[size_upload] => 43
[size_download] => 327
[speed_download] => 2291
[speed_upload] => 301
[download_content_length] => -1
[upload_content_length] => 43
[starttransfer_time] => 0.142659
[redirect_time] => 0
[certinfo] => Array
    (
    )

[primary_ip] => nnn.nnn.nnn.nn
[primary_port] => 443
[local_ip] => nnn.nnn.nnn.nn
[local_port] => 53154
[redirect_url] => https://*******.********.co.uk/Dispatcher?menuid=badorMissingCSRFT

)

如果有人知道为什么或如何服务器可以对浏览器请求的 cURL 给出不同的响应,我将非常感激 -thanks.of

【问题讨论】:

  • 联系网站并询问他们需要什么才能使您的脚本正常工作。
  • “如果有人知道为什么或如何服务器可以对浏览器请求的 cURL 给出不同的响应” – 任何可能的原因,从一些琐碎的事情开始作为用户代理,更详细地说明将您的请求分类为不是来自“浏览器”的原因。如果该网站似乎对您尝试做的事情采取了措施,那么这可能表明他们不希望您这样做......

标签: php curl http-status-code-302


【解决方案1】:

curl 使用 -L 或 --location 选项跟随重定向。

curl -L google.com

【讨论】:

    【解决方案2】:

    您需要遵循重定向:

    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    

    不遵循重定向的其他原因:

    4.14 重定向在浏览器中有效,但在 curl 中无效!

    curl 很好地支持 HTTP 重定向(参见第 3.8 条)。浏览器通常至少支持另外两种 curl 不支持的重定向方式:

    元标记。您可以编写一个 HTML 标签,让浏览器在一定时间后重定向到另一个给定的 URL。

    Javascript。您可以编写嵌入在 HTML 页面中的 Javascript 程序,将浏览器重定向到另一个给定的 URL。

    没有办法让 curl 跟随这些重定向。您必须手动确定页面要执行的操作,或者编写解析结果并获取新 URL 的脚本。

    来源:http://curl.haxx.se/docs/faq.html#Redirects_work_in_browser_but_no

    【讨论】:

      【解决方案3】:

      也许服务器开始检查User-Agent:Referer: HTTP 标头。

      尝试嗅探浏览器发送的请求(现代浏览器的开发者工具会告诉您请求的外观)并更新cUrl 代码以匹配浏览器发送的请求。

      还要考虑您在问题的 cmets 中收到的建议(询问网站所有者或停止自动收割他们的网站)。

      【讨论】:

      • 谢谢@axaic - 当我早一点醒来并在看到您的回复之前尝试了这些设置时,我的想法是一样的。不幸的是没有运气。我们已经使用这个爬虫很多年了,网站所有者知道并且视而不见,让我们每天的请求数量合理(没有超过) - 网站的所有权发生了变化,很可能是政策/内心的变化。
      • Curl 默认不跟随重定向,官方页面指定
      • 嗯,这需要设置CURLOPT_FOLLOWLOCATION,如this aswer 中所述。
      猜你喜欢
      • 2023-03-21
      • 2011-03-25
      • 2018-05-28
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 2023-04-09
      • 2011-11-09
      • 2023-03-21
      相关资源
      最近更新 更多