我无法使用PHP解决curl中的重定向问题。我调用了URL https://data.fei.org/Horse/Search.aspx,但结果我得到了一个登录站点。这不会发生在所有服务器上。在测试环境中,它可以工作,但不是生产服务器。那是我的卷曲初学
public class ProductCategory
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int? Id { get; set; }
[Required]
[MaxLength(50)]
public string Name { get; set; }
[Required]
public string Code { get; set; }
[MaxLength(1000)]
public string Description { get; set; }
public string CategoryImgeUrl { get; set; }
public Product Product { get; set; }
}
我知道为什么我会在生产中重定向而不是在测试环境中重定向?
答案 0 :(得分:0)
最佳猜测:在测试服务器上,您具有对/ tmp的写入权限,并且确实可以在那里创建新文件,但在生产服务器上,您没有对/ tmp的写入权限。因为您没有检查tempnam的返回类型,所以您将curl bool(false)提供给生产服务器上的CURLOPT_COOKIEFILE,并且curl无法保存/加载cookie,并且无法将请求#1中收到的cookie提供给后续位置重定向请求#2 - 因为它有一个无效的cookie文件。
验证,添加更多错误检查(这实际上是你应该首先完成的,甚至在询问stackoverflow之前)
$checkFile = tempnam('/tmp', 'cookie.txt');
if(false===$checkFile){
throw new \RuntimeException('tmpnam failed to create cookie temp file!');
}
也是protip,在调试curl代码时,总是启用CURLOPT_VERBOSE,它会打印许多有用的调试信息,包括所有重定向,以及所有重定向发送的cookie。
在同样的说明中,也将错误检查添加到curl_setopt。如果出现问题,设置curl选项curl_setopt将返回bool(false)。在我的卷发包装中,我做了
$ret = curl_setopt ( $this->curlh, $option, $value );
if (! $ret) {
throw new InvalidArgumentException ( 'curl_setopt failed. errno: ' . $this->errno () . '. error: ' . $this->error () . '. option: ' . var_export ( $this->_curlopt_name ( $option ), true ) . ' (' . var_export ( $option, true ) . '). value: ' . var_export ( $value, true ) );
}
(来自https://github.com/divinity76/hhb_.inc.php/blob/master/hhb_.inc.php#L997)
另一种可能性是您的prod服务器被禁止登录。