프록시를 통해 CURL을 사용하는 방법은 무엇입니까?


128

프록시 서버를 사용하도록 curl을 설정하려고합니다. URL은 문제가되지 않은 html 양식으로 제공됩니다. 프록시가 없으면 정상적으로 작동합니다. 이 사이트와 다른 사이트에서 코드를 찾았지만 작동하지 않습니다. 올바른 해결책을 찾는 데 도움을 주시면 감사하겠습니다. 나는 벨로우즈가 가깝다고 생각하지만 뭔가 빠진 것 같습니다. 감사합니다.

여기에서 수정 한 다음 코드 는 http://www.webmasterworld.com/forum88/10572.htm 이지만 12 행에 누락 된 T_VARIABLE에 대한 오류 메시지를 반환합니다.

<?

$url = '$_POST[1]';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 0);
curl_setopt($ch, CURLOPT_PROXY, '66.96.200.39:80');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,'GET');
curl_setopt ($ch, CURLOPT_HEADER, 1)
curl_exec ($ch); 
$curl_info = curl_getinfo($ch);
curl_close($ch);
echo '<br />';
print_r($curl_info);
?>

다음은 프록시를 통한 컬에서 내용을 반환하지 않음

<?

$proxy = "66.96.200.39:80";
$proxy = explode(':', $proxy);
$url = "$_POST[1]";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXY, $proxy[0]);
curl_setopt($ch, CURLOPT_PROXYPORT, $proxy[1]);
curl_setopt($ch, CURLOPT_HEADER, 1);

$exec = curl_exec($ch);

echo curl_error($ch);
print_r(curl_getinfo($ch));
echo $exec;
?>

현재 pelican-cement.com에 있지만 작동하지 않습니다.

업데이트 : 모든 도움을 주셔서 감사합니다. 위의 내용을 변경했습니다. 이제 빈 화면 만 반환합니다.

<?

$url = $_POST['1'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 0);
curl_setopt($ch, CURLOPT_PROXY, '66.96.200.39:80');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,'GET');
curl_setopt ($ch, CURLOPT_HEADER, 1);
curl_exec ($ch); 
$curl_scraped_page = curl_exec($ch);
curl_close($ch);

echo $curl_scraped_page;
?> 

3
12 번째 줄에 세미콜론이 없습니다
Pekka

또한 $ url = '$ _POST [1]'을 $ url = $ _POST [1] (으)로 변경해야합니다. 그렇지 않으면 $ url은 원하는 URL 대신 문자열이됩니다.
yoavmatchulsky

또한 $ _POST 배열의 키는 정수가 아닌 문자열이므로 말하고 싶을 것입니다.$_POST['1']
fiiv

2
pelican-cement.com의 양식에는 "firstname"및 "lastname"이라는 이름의 입력이 있지만 "1"은 없습니다.
John Flatness

2
@ user586011 : 아래 답변으로 솔루션을 추가하고 수락하십시오. 해결책을 문제에 넣지 마십시오.
hakre

답변:


221

다음은 버그가 제거 된 작동 버전입니다.

$url = 'http://dynupdate.no-ip.com/ip.php';
$proxy = '127.0.0.1:8888';
//$proxyauth = 'user:password';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
//curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
$curl_scraped_page = curl_exec($ch);
curl_close($ch);

echo $curl_scraped_page;

CURLOPT_PROXYUSERPWD프록시에 사용자 이름과 비밀번호가 필요한 경우를 대비하여 추가 했습니다. CURLOPT_RETURNTRANSFER데이터를 $curl_scraped_page변수 로 반환하도록 1로 설정 했습니다 .

curl_exec($ch);변수가 반환되지 않도록 두 번째 추가 항목 을 제거했습니다 . 프록시 IP와 포트를 하나의 설정으로 통합했습니다.

나는 또한 제거 CURLOPT_HTTPPROXYTUNNELCURLOPT_CUSTOMREQUEST같이이 기본이었다.

헤더를 반환하지 않으려면 주석 처리하십시오 CURLOPT_HEADER.

프록시를 비활성화하려면 단순히 null로 설정하십시오.

curl_setopt($ch, CURLOPT_PROXY, null);

궁금한 점이 있으시면 cURL매일 같이 일하십시오.


CURL로 매일 작업한다는 것을 알게되어 반갑습니다. 양말 프록시를 설정하려고 시도했지만 로컬 컴퓨터에서는 작동하지만 Linux 전용 서버에서는 작동하지 않습니다. 어떤 아이디어?
coding_idiot

@coding_idiot 대부분의 웹 호스트는 보안상의 이유로 80 또는 443이 아닌 포트를 차단합니다.
sousdev

나는 이미 그것을 해결했다. 나는 다른 사람들이 이것으로부터 이익을 얻을 것이라고 확신합니다.
coding_idiot

@GravyCode :이 경우 일부 서비스에서 프록시를 얻는다면 사용자 이름 / 암호를 전달해야합니까?
Pragnesh Chauhan

1
프록시 호스트가 웹 호스트에 의해 차단되었는지 어떻게 알 수 있습니까?
user1788736

35

CURL PROXY에 필요한 다양한 CURL 옵션 사용에 대해 설명했습니다.

$url = 'http://dynupdate.no-ip.com/ip.php';
$proxy = '127.0.0.1:8888';
$proxyauth = 'user:password';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);         // URL for CURL call
curl_setopt($ch, CURLOPT_PROXY, $proxy);     // PROXY details with port
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth);   // Use if proxy have username and password
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); // If expected to call with specific PROXY type
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  // If url has redirects then go to the final redirected URL.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);  // Do not outputting it out directly on screen.
curl_setopt($ch, CURLOPT_HEADER, 1);   // If you want Header information of response else make 0
$curl_scraped_page = curl_exec($ch);
curl_close($ch);

echo $curl_scraped_page;

3
이러한 의견은 도움이되지만 다른 사람들은 추가 옵션이 실제로 필요 하지는 않습니다 .
Nate

-1

자세한 자체 설명 주석으로 프로젝트에 사용한 잘 테스트 된 기능은 다음과 같습니다.


80 이외의 포트가 서버 방화벽에 의해 차단되는 경우가 많으므로 코드가 localhost에서는 제대로 작동하지만 서버에서는 작동하지 않는 것으로 보입니다.

function get_page($url){

global $proxy;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_HEADER, 0); // return headers 0 no 1 yes
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // return page 1:yes
curl_setopt($ch, CURLOPT_TIMEOUT, 200); // http request timeout 20 seconds
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Follow redirects, need this if the url changes
curl_setopt($ch, CURLOPT_MAXREDIRS, 2); //if http server gives redirection responce
curl_setopt($ch, CURLOPT_USERAGENT,
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt"); // cookies storage / here the changes have been made
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // false for https
curl_setopt($ch, CURLOPT_ENCODING, "gzip"); // the page encoding

$data = curl_exec($ch); // execute the http request
curl_close($ch); // close the connection
return $data;
}

1
이것은 나를 도왔다 : curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false); // https의 경우 false
villamejia 22. 11.

1
@villamejia CURLOPT_SSL_VERIFYPEER = false를 사용할 때는주의하십시오. 즉, cURL은 https 서버에 연결할 때 인증서 검사를 수행하지 않으므로 연결이 중간자 공격에 취약 해 지므로 데이터 보안이 더 이상 보장되지 않습니다. CURLOPT_CAPATH를 사용하여 유효한 루트 인증 기관 세트 (/etc/ssl/certs 예 : 데비안 / 우분투)가
Ale
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.