2016-04-11 238 views
1

我试图卷曲导致403 Forbidden错误的远程站点。在同一台服务器上,我可以通过终端运行以下两个命令。第一次失败,第二次失败。如何让我的PHP代码与第二个终端命令相匹配?PHP cURL导致403禁止

此终端命令导致没有任何返回。

curl http://www.barneys.com 

在一个正确的结果这个终端指令结果(网页的HTML)

curl -L http://www.barneys.com 

我的PHP代码:

$ch = curl_init('http://www.barneys.com'); 
$http_headers = array(
'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:40.0)' . 'Gecko/20100101 Firefox/40.0', 
'Accept: */*', 
'X-Requested-With: XMLHttpRequest', 
'Referer: http://www.barneys.com', # IMPORTANT 
'Accept-Language: pt-BR,en-US;q=0.7,en;q=0.3', 
); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $http_headers); 
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_REFERER, 'http://www.barneys.com'); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); 
curl_setopt($ch, CURLOPT_TIMEOUT, 60); 
$response = curl_exec($ch); 
$redirectURL = curl_getinfo($ch,CURLINFO_EFFECTIVE_URL); 
curl_close($ch); 

echo $response; 

编辑:下面是从日志通过PHP的cURL请求:

* About to connect() to www.barneys.com port 80 (#0) 
* Trying 23.204.27.110... * connected 
* Connected to www.barneys.com (23.204.27.110) port 80 (#0) 
> GET/HTTP/1.1 
Host: www.barneys.com 
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:40.0)Gecko/20100101 Firefox/40.0 
Accept: */* 
X-Requested-With: XMLHttpRequest 
Referer: http://www.barneys.com 
Accept-Language: pt-BR,en-US;q=0.7,en;q=0.3 
Connection: keep-alive 

< HTTP/1.1 403 Forbidden 
< Server: AkamaiGHost 
< Mime-Version: 1.0 
< Content-Type: text/html 
< Content-Length: 265 
< Expires: Mon, 11 Apr 2016 23:22:16 GMT 
< Date: Mon, 11 Apr 2016 23:22:16 GMT 
< Connection: close 
< 
* Closing connection #0 
+0

首先状态码是301。基本上在curl -L状态中遵循重定向,所以'curl_setopt($ ch,CURLOPT_FOLLOWLOCATION,true);'应该就足够了。附上一些输出或错误来调试错误 – georoot

+0

谢谢@georoot我已经添加了上面的日志。让我知道如果这有帮助! – yourfavorite

+0

似乎如果你添加一个头,“连接:保持活着”,它会起作用。 – drew010

回答

1

您的php cURL请求中没有包含请求标头。为了解决这个问题,添加以下行的设置CURLOPT_HTTPHEADER选择权之前:

curl_setopt($ch, CURLOPT_HEADER, true); 

PHP curl docs

CURLOPT_HEADER TRUE包括在输出中的标题。

此外,如果向URL添加尾部斜线,URL将不需要由cURL重建。很多你的代码似乎是不必要的。这是一个修剪下来的工作示例:

<?php 
$ch = curl_init('http://www.barneys.com/'); 
$http_headers = array(
    'User-Agent: Junk', // Any User-Agent will do here 
); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $http_headers); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$response = curl_exec($ch); 
curl_close($ch); 

echo $response;