cURL 返回 302,而浏览器返回 200

MJW*_*MJW 5 php curl http-status-code-302

我有一个脚本,它使用大量 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));
Run Code Online (Sandbox Code Playgroud)

返回:

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
Run Code Online (Sandbox Code Playgroud)

如果有人知道服务器为何或如何对浏览器请求的 cURL 提供不同的响应,我将非常感激 - 感谢。

aer*_*tal 3

您需要遵循重定向:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
Run Code Online (Sandbox Code Playgroud)

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

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