解决HEAD请求问题

时间:2009-12-29 22:29:31

标签: php curl

我一直致力于将客户数据发布到拨号服务器的脚本。我刚刚发布了一个类似的问题,但终于能够得到一些回应。但是,我正面临另一个问题。

当我从本地主机服务器测试脚本时,数据正在成功发送,我得到200 OK的http响应。从我的localhost服务器,当我检查curl_info的详细信息时,request_header显示已使用POST。

当我在另一台服务器上测试相同的脚本时,不会返回任何响应。然而,HTTP_CODE显示401表示和授权问题。但是request_header是HEAD。

现在任何人都可以帮我弄清楚为什么request_headers之间存在这样的差异,如果有办法强制秒服务器使用POST。我觉得这台服务器的HEAD请求有问题。

这是我正在使用的脚本:

$full_url = $_GET['url'] . urlencode($_GET['attrib']);

$loginUsername = "123456";
$loginPassword = "123456";

$unencriptedString = $loginUsername.":".$loginPassword;
$encryptedString = base64_encode($unencriptedString);


$headers         =    array("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
                        "Accept-Language: en-gb",
                        "Accept-Encoding: gzip,deflate",
                        "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7",
                        "Keep-Alive: 300",
                        "Connection: keep-alive",
                        "Content-type: application/x-www-form-urlencoded;charset=UTF-8",
                        "Content-length: " . strlen($_GET['attrib']),
                        "Transfer-Encoding: chunked",
                        $_GET['attrib'],
                        );

$user_agent       = "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.5)";                             
$ch = curl_init();
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );    # required for https urls
curl_setopt( $ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt( $ch, CURLOPT_URL, $_GET['url']);
curl_setopt( $ch, CURLOPT_USERPWD, "$loginUsername:$loginPassword"); //login
curl_setopt( $ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt( $ch, CURLOPT_POST, 1); 
curl_setopt( $ch, CURLOPT_POSTFIELDS, $_GET['attrib']);
curl_setopt( $ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); 
// curl_setopt( $ch, CURLOPT_TIMEOUT, 10);
curl_setopt( $ch, CURLINFO_HEADER_OUT, 1);
curl_setopt( $ch, CURLOPT_VERBOSE, 1);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER,1);

$response = curl_exec($ch);  
if (!$response) {  
   $response = curl_error($ch);  
}
echo "<p>" . $response . "</p>"; 

$info = curl_getinfo($ch);

if (curl_error($ch)) {
   echo "ERROR ". curl_error($ch) ."\n<br/>";
} else {
   print "<pre>";
   print_r($info);
   print "</pre>";
}

echo "<p>&nbsp;</p>";   

var_dump($headers);

curl_close($ch);

由于

詹姆斯

2 个答案:

答案 0 :(得分:0)

我会尝试使用此选项 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

作为解决方法,您可以考虑使用CURLOPT_CUSTOMREQUEST选项。

答案 1 :(得分:0)

HEAD请求通常是代理或缓存检查的结果,如果缓存内容在发出GET以刷新内容之前仍然有效 - 客户端和服务器之间是否有代理或缓存?我不希望它在POST之前使用,因为它没有任何意义。

我会尝试使用Wireshark或类似方法来准确跟踪请求和响应的顺序以及它们的来源。

另一个替代方案是转储HTTP流量的简单代理,谷歌的第一个结果就是这个(我自己没用过): http://www.fiddler2.com/fiddler2/