2012-06-28 135 views
0

PHP的捲曲似乎並不包括這樣做的請求時,主機頭:PHP捲曲不包括主機http頭

<?php 
    $handle = curl_init('http://example.com/'); 
curl_setopt_array($handle, array(
    CURLOPT_USERAGENT => 'test ua', 
    CURLOPT_REFERER => 'http://example.org/', 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_PROXY => '127.0.0.1:8080', 
    CURLOPT_PROXYTYPE => CURLPROXY_HTTP, 

    //Doesn't work if you specify it manually or leave it out: 
    CURLOPT_HTTPHEADER => array(
     'Host: example.com' 
    ) 
)); 

print_r(curl_getinfo($handle)); 
echo curl_exec($handle); 
?> 
+0

你怎麼知道它不包括主機頭?它始終會是因爲它是HTTP 1.1的一個要求,是什麼讓你認爲它沒有這樣做? – DaveRandom

+0

@DaveRandom我正在使用Charles Web調試代理,我可以看到它不包含在那裏。 – Tyilo

+0

這很奇怪 - 它使用HTTP/1.0嗎?嘗試迫使cURL使用HTTP/1.1並使用'CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1',即使它目前顯示爲1.1,我會建議嘗試此操作。 PHP/libcurl版本? – DaveRandom

回答

0

這是一個完全無關的錯誤,即發生由具有用戶代理內斷行,例如:

curl_setopt_array($handle, array(
    CURLOPT_USERAGENT => "user-agent\n" 
)); 
+0

啊對。是的,它會打破它。雖然我很驚訝,但cURL並沒有對此進行清理,如果您正在使用調試代理查看請求,我會盡快做到這一點,但嘿......爲了將來的參考,您應該始終發佈儘可能在問題中提供實際代碼,更改用戶名/密碼和(如果您必須的話)URL *僅*因爲它通常是您看不到的問題,但其他人會立即發現 - 因爲您編輯了UA任務,沒有看到它。但很高興你對它進行了整理:-) – DaveRandom

+0

@DaveRandom你在請求中看不到它,原始請求是3行,其中第1行是'GET http:// example.com /',第2行是'用戶代理:測試ua',第三行是空的。 – Tyilo

+0

是的,但如果你看過身體,你會看到其餘的標題,因爲這基本上是因爲額外的'\ n'。除非查爾斯沒有向你展示身體,因爲GET不應該有 - 但如果是這樣的話,坦率地說它不是一個很好的調試工具。對於網絡級別的東西,我使用[Wireshark](http://wireshark.org/),因爲您正在檢查原始TCP數據包,而不是應用程序層解釋它們的含義。 – DaveRandom

0

主機頭是由curl_init()

+0

它不會發送**任何**主機標題! – Tyilo

+0

你怎麼知道? curl_getinfo()不會告訴你。 print_r(curl_getinfo($ handle));和echo curl_exec($ handle);返回? –

+0

看到我的回答,對不起 – Tyilo

0

參數定義當您指定請求URL時,PHP將自動使用Host標頭。

下面的示例現在應該是足夠的確認:

<?php 
$handle = curl_init('http://pgl.yoyo.org/http/browser-headers.php'); 
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); 

echo curl_exec($handle); 
?> 

輸出HTML列出了請求頭,其中我們看到Host: pgl.yoyo.org,如所預期。

+0

我得到'400壞請求',因爲主機不在我說的範圍內。 – Tyilo