У меня есть скрипт curl, который действует как прокси-сервер между клиентом и основным сервером.
……
$field_array= array( 'Accept' => 'HTTP_ACCEPT', 'Accept-Charset' => 'HTTP_ACCEPT_CHARSET', 'Accept-Encoding' => 'HTTP_ACCEPT_ENCODING', 'Accept-Language' => 'HTTP_ACCEPT_LANGUAGE', 'Connection' => 'HTTP_CONNECTION', 'Host' => 'HTTP_HOST', 'Referer' => 'HTTP_REFERER', 'User-Agent' => 'HTTP_USER_AGENT' ); $curl_request_headers=array(); foreach ($field_array as $key => $value) { if(isset($_SERVER["$value"])) { $server_value=$_SERVER["$value"]; $curl_request_headers[]="$key: $server_value"; } }; $curl_request_headers[]="Expect: "; session_write_close(); //Open connection $curl_handle = curl_init(); curl_setopt($curl_handle,CURLOPT_COOKIE,session_name()."=".session_id().";"); //Set the url, POST data curl_setopt($curl_handle, CURLOPT_URL, $curl_url); curl_setopt($curl_handle, CURLOPT_POST, !empty($user_post_data)); curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $user_post_data); curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl_handle, CURLOPT_AUTOREFERER, TRUE); curl_setopt($curl_handle, CURLOPT_HEADER, 1); curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, false); curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $curl_request_headers); curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, false); $result = curl_exec($curl_handle); //Close connection curl_close($curl_handle); list($headers,$content)=explode("\r\n\r\n",$result,2); foreach (explode("\r\n",$headers) as $hdr) { if(preg_match("/Transfer-Encoding:.*chunked/i", $hdr)) { // Remove chunked headers. Not properly handled by browsers } else { header($hdr); }; } echo $content;
Теперь, на главном сервере, я установил cookie в скрипт, а затем попытаюсь прочитать его значение в другом скрипте. Я не могу прочитать значение. Таким образом, есть некоторая проблема, передающая значение вокруг в curl. Как исправить?
благодаря
Собственно, глупая проблема. Мне нужно явно установить файлы cookie в CURLOPT_COOKIE. Следующий код теперь работает для меня:
...... $_COOKIE[session_name()]=session_id(); $cookie_string=""; foreach( $_COOKIE as $key => $value ) { $cookie_string .= "$key=$value;"; }; //Open connection $curl_handle = curl_init(); curl_setopt($curl_handle,CURLOPT_COOKIE, $cookie_string); ......
вы должны добавить пробел после точки с запятой, чтобы лучший способ:
$cookie = array(); foreach( $_COOKIE as $key => $value ) { $cookie[] = "{$key}={$value}"; }; $cookie = implode('; ', $cookie); $curl_handle = curl_init(); curl_setopt($curl_handle, CURLOPT_COOKIE, $cookie);
Рассмотрите http_build_cookie () вместо импликации строки cookie или, если у вас нет установленного pecl_http:
http_build_query($cookies, null, ';')
Довольно просто.