2010-11-27 13 views
2

私はphpとcurlを使って内部プロキシをセットアップしました。ほとんどの場合、HTTP_HOSTヘッダーフィールドの設定に問題があります。これは私が使用していたコードです:私のコンテンツサーバ上で、PHPカール:問題設定HTTP_HOST

$data_server_url = "http://IP_ADDRESS_OF_MY_CONTENT_SERVER/"; 
$request_uri=""; 
if(isset($_SERVER['REQUEST_URI'])) { $request_uri = $_SERVER['REQUEST_URI']; }; 
$curl_url="${data_server_url}${request_uri}"; 

//Pass all these fields as-they-are-got from the client to the content server. 
$field_array=array("HTTP_ACCEPT", "HTTP_ACCEPT_CHARSET", 
     "HTTP_ACCEPT_ENCODING", "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION", 
     "HTTP_HOST", "HTTP_REFERER", "HTTP_USER_AGENT"); 

$curl_request_headers=array(); 

foreach ($field_array as &$field) { 
    if(isset($_SERVER["$field"])) { 
     $curl_request_headers["$field"]=$_SERVER["$field"]; 
    } else { 
     $curl_request_headers["$field"]=""; 
    }; 
}; 

//Open connection 
$curl_handle = curl_init(); 
//Set the url, number of POST vars, POST data 
curl_setopt($curl_handle, CURLOPT_URL, $curl_url); 
curl_setopt($curl_handle, CURLOPT_POST, count($_POST)); 
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $_POST); 
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl_handle, CURLOPT_AUTOREFERER, TRUE); 
curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $curl_request_headers); 
//Execute post 
$result = curl_exec($curl_handle); 
//Close connection 
curl_close($curl_handle); 

ただし、プロキシサーバー::上


コード、$ _SERVER [ 'HTTP_HOST']に設定されています独自のIPアドレス(nullまたはプロキシサーバーがアクセスされるHTTP_HOST変数である必要があります)。

誰でも修正案を提案できますか? the documentationから

答えて

3

値は、オプションパラメータの次の値の配列でなければなりません:

 ... 

CURLOPT_HTTPHEADER An array of HTTP header fields to set, in the format 
         array('Content-type: text/plain', 'Content-length: 100') 

そうそう、私はあなたがそれらを適切に設定しているとは思いません。

+0

ありがとうございます。これはうまくいった! –

0

$ _SERVER配列でPHPが使用する名前をヘッダーに付けていますが、これは実際のHTTPヘッダーで使用する名前です。たとえば、HTTP_HOSTヘッダーは 'Host'として送信されます。

PHPの名前から正しいHTTPヘッダー名にマップするように$ fieldarrayを変更することをお勧めします。Ignacioは別の答えで、curlのドキュメントでこれらのヘッダーを渡す方法を確認してください。

2

$ _SERVER配列は、生のヘッダーと同じキーを使用しません。次のようなものを試してみてください。

$pass_headers = array(
    'Host' => 'HTTP_HOST', 
    'Accept' => 'HTTP_ACCEPT', 
    'Accept-Charset' => 'HTTP_ACCEPT_CHARSET', 
    'Accept-Encoding' => 'HTTP_ACCEPT_ENCODING', 
    'Accept-Language' => 'HTTP_ACCEPT_LANGUAGE', 
    'Connection' => 'HTTP_CONNECTION', 
    'Referer' => 'HTTP_REFERER', 
    'User-Agent' => 'HTTP_USER_AGENT', 
); 

$curl_request_headers = array(); 
foreach($pass_headers as $header_key => $server_key) { 
    $curl_request_headers[] = $header_key.': '.$_SERVER[$server_key]; 
} 
+0

ありがとう!これを試してみました。残念ながらうまくいきませんでした。それはIgnacioが述べたように正確な形式(コロンで)でなければなりません。 –

+0

更新されたコードが動作するはずです。 – Kevin

+0

ええ、今非常に似た何かを使って! –