PHP curl重定向到另一个站点

时间:2017-07-26 13:13:01

标签: php curl

我无法使用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; }

}

我知道为什么我会在生产中重定向而不是在测试环境中重定向?

1 个答案:

答案 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服务器被禁止登录。