我遇到了同样的问题。我编写了一些手动跟随重定向的代码。请确保您阅读并理解代码,并在将其用于生产之前了解任何安全问题!
function remote_file($f){
$i = 0;
do {
if($i++ > 10) die();
//Pull the headers and check for redirects
$cr = curl_init($f);
curl_setopt($cr, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($cr, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($cr, CURLOPT_BINARYTRANSFER, TRUE);
curl_setopt($cr, CURLOPT_HEADER, TRUE);
$curl_ret = curl_exec($cr);
//echo $curl_ret;
if(curl_getinfo($cr,CURLINFO_HTTP_CODE)!=200) {
$matches = preg_match_all('~location: ?(.*)~i',$curl_ret,$output);
if($matches) {
$f = $output[1][0];
}
} else $matches = 0;
} while ($matches);
$cr = curl_init($f);
curl_setopt($cr, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($cr, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($cr, CURLOPT_BINARYTRANSFER, TRUE);
//curl_setopt($cr, CURLOPT_FOLLOWLOCATION, TRUE); //Doesn't work with open_basedir retriction in effect
$curl_ret = curl_exec($cr);
curl_close($cr);
return $curl_ret;
}
编辑:在 HttpClient.php 中,你应该有一个类似的函数
private function _init($url,$token)
{
$this->_url = $url;
$this->_token = $token;
//init connection
$this->_curlConn = curl_init($this->_url);
curl_setopt($this->_curlConn, CURLOPT_HEADER, false);
curl_setopt($this->_curlConn, CURLOPT_NOBODY, false);
curl_setopt($this->_curlConn, CURLOPT_RETURNTRANSFER, true);
curl_setopt($this->_curlConn, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($this->_curlConn, CURLOPT_USERPWD, $this->_token);
curl_setopt($this->_curlConn, CURLOPT_TIMEOUT, 4);
curl_setopt($this->_curlConn, CURLOPT_SSL_VERIFYPEER, FALSE); // Validate SSL certificate
curl_setopt($this->_curlConn, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($this->_curlConn, CURLOPT_USERAGENT, "FreshBooks API AJAX tester 1.0");
return $this;
}
你需要重写这个函数,比如
private function _init($url,$token)
{
$this->_url = $url;
$this->_token = $token;
//init connection
$i = 0;
do {
if($i++ > 10) die();
//Pull the headers and check for redirects
$this->_curlConn = curl_init($this->_url);
curl_setopt($this->_curlConn, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($this->_curlConn, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($this->_curlConn, CURLOPT_BINARYTRANSFER, TRUE);
curl_setopt($this->_curlConn, CURLOPT_HEADER, TRUE);
curl_setopt($this->_curlConn, CURLOPT_USERPWD, $this->_token);
curl_setopt($this->_curlConn, CURLOPT_USERAGENT, "FreshBooks API AJAX tester 1.0");
$curl_ret = curl_exec($cr);
//echo $curl_ret;
if(curl_getinfo($cr,CURLINFO_HTTP_CODE)!=200) {
$matches = preg_match_all('~location: ?(.*)~i',$curl_ret,$output);
if($matches) {
$this->_url = $output[1][0];
}
} else $matches = 0;
} while ($matches);
$this->_curlConn = curl_init($this->_url);
curl_setopt($this->_curlConn, CURLOPT_HEADER, false);
curl_setopt($this->_curlConn, CURLOPT_NOBODY, false);
curl_setopt($this->_curlConn, CURLOPT_RETURNTRANSFER, true);
//curl_setopt($this->_curlConn, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($this->_curlConn, CURLOPT_USERPWD, $this->_token);
curl_setopt($this->_curlConn, CURLOPT_TIMEOUT, 4);
curl_setopt($this->_curlConn, CURLOPT_SSL_VERIFYPEER, FALSE); // Validate SSL certificate
curl_setopt($this->_curlConn, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($this->_curlConn, CURLOPT_USERAGENT, "FreshBooks API AJAX tester 1.0");
return $this;
}
这将有效地继续将请求发送到他们的 API,直到它返回不是重定向的东西。当它感到高兴时,它会将那个重定向后的 URL 传递给标准代码,标准代码会拾取它并继续前进。
哦,在进行这项工作之前我会尝试的另一件事......如果您只是注释掉 HttpClient.php 中的违规行怎么办?它真的需要遵循任何重定向吗?