2009-12-29 169 views
0

我一直致力於將客戶數據發佈到撥號服務器的腳本。我前段時間發佈了類似的問題,但最終得到了一些迴應。但是,我面臨另一個問題。HEAD請求問題的解決方案

當我從我的本地主機服務器測試腳本時,數據發送成功,我得到一個200 OK的http響應。在我的本地主機服務器上,當我查看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); 

感謝

詹姆斯

+0

我相信你得到一個「HEAD使用」,因爲您發送HEAD在GET/POST之前。因此,由於你獲得了401,所以POST/GET甚至從未談過。如果是這樣的話,一旦你找出你的認證問題,你應該很樂意去。只是一個預感。 – 2009-12-29 22:45:36

+0

這只是奇怪的是,我沒有任何問題在我的本地服務器上使用這個腳本,但在其他地方,有一個大問題.. – James 2009-12-29 23:00:42

回答

0

我會嘗試使用此選項 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

作爲一種解決辦法,你可以考慮使用CURLOPT_CUSTOMREQUEST選項。

0

HEAD請求通常是代理或緩存檢查的結果,如果在發出GET刷新內容之前緩存的內容仍然有效 - 客戶端和服務器之間是否存在代理或緩存?我不希望它在POST之前使用,因爲它沒有任何意義。

我會嘗試使用Wireshark或類似的方法來精確地追蹤請求和響應的順序以及它們的起源。

另一個altenerative是一個簡單的代理轉儲HTTP通信,第一個結果在谷歌是這個(沒有用它自己): http://www.fiddler2.com/fiddler2/