PHP CURL 重定向

3

我在PHP方面还比较新手。目前我遇到了有关PHP curl post和重定向的问题。我已经编写了很多代码来连接跨域API。在这个API中,响应会将我的页面重定向到另一个页面。

所以,现在我面临的问题是我无法按照API响应进行操作。这意味着在我的PHP脚本中,我的curl已经接收到了重定向页面的网页内容,但我的页面仍然保持不变。

请问PHP curl能够遵循API重定向吗?

有人知道如何解决这个问题吗?

以下是我的代码。

$url = "http://www.google.com.my"; //example this is an API
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($ch, CURLOPT_REFERER, $url);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt ($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Content-Length: ' . strlen($data_string))); 

$result = curl_exec($ch);
$response = curl_getinfo($ch);
curl_close($ch); 

在 $result 中,我收到了API重定向页面。但这只是网页内容。

1
请提供你的代码和你尝试过的方法。 - AHJeebon
$data_string 的值是什么?而且 [http://www.google.com.my] 没有提供任何 URL。 - AHJeebon
$data_string将作为json参数设置以连接API。而url仅是API的示例。 - yew pan
2个回答

6

CURLOPT_FOLLOWLOCATION设置为true,使cURL跟随重定向。

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

来源:http://php.net/manual/zh/function.curl-setopt.php

该函数是用来设置 cURL 传输选项的。cURL 是一个用来与服务器进行通信的库,它支持多种协议。这个函数可以作为 cURL 函数的参数使用。
例如,你可以使用该函数来设置您要连接的 URL、传递数据或配置 cURL 如何处理回复。更多细节可以在 PHP 文档中找到。

5
这里有两个HTTP请求。
1. 浏览器到您的PHP服务器的请求。 2. PHP到API的请求。
这两个请求是独立的。它们有自己的响应,没有你自己创建的连接。
如果第二个响应中说“重定向”,那么第一个响应并不会自动地也说“重定向”。
要做到这一点:
- 将CURLOPT_FOLLOWLOCATION关闭 - 从第二个响应中读取Location header - 在您的PHP中发出Location header(使用header()函数),以便它出现在第一个响应中
这假设您的请求的响应直接在浏览器中显示,例如您正在提交表单。
如果第一个请求是Ajax请求,则重定向它只会导致JavaScript传递重定向页面。它不会在浏览器中加载新页面。如果您想告诉JavaScript加载新页面,则需要:
- 将CURLOPT_FOLLOWLOCATION关闭 - 从第二个响应中读取Location header - 将其放在第一个响应的正文中(您可能将其编码为JSON) - 在JavaScript中读取该响应,并使用它将location.href设置为新值

但是我现在面临的问题是跨域API会自动将页面重定向到另一个页面。如果根据您刚才提供的内容,使用header()将在访问控制允许来源时崩溃。 - yew pan
@yewpan - 这个答案有两个部分。第二部分涉及JavaScript情况。将location.href设置为新值不会导致跨源错误。 - Quentin
但是每次加载到API中都需要以JSON格式发布一些参数,这就是我感到困惑的原因。 - yew pan
@yewpan - 我不知道你上一条评论的意思。 - Quentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接