2015-03-30 23 views
9

Nie mogę ustawić hosta w curl. Nadal pokazuje jak localhost jeśli używam następujący kodcant set Host w CURL PHP

function wget($url) 
     { 

      $agent= 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0.1'; 
      $curlHeaders = array (
        'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
        'Accept-Encoding: gzip, deflate', 
        'Accept-Language: en-US,en;q=0.5', 
        'User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0.1', 
        'Connection: Keep-Alive', 
        'Pragma: no-cache', 
        'Referer: http://example.com/', 
        'Host: hostname', 
        'Cache-Control: no-cache', 
        'Cookie: visid_incap_185989=9v1q8Ar0ToSOja48BRmb8nn1GFUAAAAAQUIPAAAAAABCRWagbDIfmlN9NTrcvrct; incap_ses_108_185989=Z1orY6Bd0z3nGYE2lbJ/AXn1GFUAAAAAmb41m+jMLFCJB1rTIF28Mg==; _ga=GA1.3.637468927.1427699070; _gat=1; frontend=rqg7g9hp2ht788l309m7gk8qi7; _gat_UA-1279175-12=1; __utma=233911437.637468927.1427699070.1427699078.1427699078.1; __utmb=233911437.2.10.1427699078; __utmc=233911437; __utmz=233911437.1427699078.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt_UA-1279175-1=1; _cb_ls=1; _chartbeat2=S0WVXDwMWnCFBgQp.1427699081322.1427699232786.1; PRUM_EPISODES=s=1427699568560&r=http%3A//example.com/' 

      ); 
      $ch = curl_init(); 
      curl_setopt ($ch, CURLOPT_HTTPHEADER, $curlHeaders); 
      curl_setopt ($ch, CURLOPT_HEADER, TRUE); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
      curl_setopt($ch, CURLOPT_USERAGENT, $agent); 
      curl_setopt($ch, CURLOPT_URL,$url); 
      $result=curl_exec($ch); 
      return $result; 
     } 

używam fiddler śledzić żądania sieciowe. gdzie znalazłem gospodarz jest nadal jako localhost enter image description here

Gdybym załadować ten sam link w przeglądarce otrzymuję następujący w fiddler

enter image description here

Potrzebuję określoną domenę, aby uzyskać dostęp. Jak mogę to osiągnąć? Uwaga: jestem świadomy, że nazwa hosta nie powinna zawierać protokołu.

Alternatywnie

Również chciałbym wiedzieć, czy jest możliwe, aby uzyskać kod źródłowy stronie internetowej mogą być widoczne w przeglądarce za pośrednictwem terminala?

+0

Proponuję zacząć od dodania 'curl_setopt ($ ch, CURLOPT_VERBOSE, true);' do twojego kodu i sprawdzenia co się dzieje w backgo und. Prawdopodobnie otrzymasz znacznie więcej informacji niż od skrzypka. –

+0

Próbowałem twojego kodu. Inne nagłówki odbioru pliku 'Host: hostname'.Myślę, że potrzebujesz czegoś takiego, aby moja strona internetowa była maskowana jako "stackoverflow.com", co jest trudne. Możesz modyfikować nagłówki, ale nie protokół HTTP (nie jest to łatwe). – Kristiyan

+1

Więc uruchomiłem to na kilku hostach, do których mam dostęp, podając adres URL do wywołania funkcji i działa bezbłędnie. Musisz sprawdzić kilka rzeczy i podać więcej informacji. 1) W jaki sposób adres URL jest podawany do wywołania funkcji, czy masz pewność, że jest ustawiony prawidłowo. to znaczy. jeśli zadzwonisz $ result = wget ($ someurl); Upewnij się, że $ someurl jest ustawione poprawnie. 2) Sprawdź ustawienia hosta i serwera proxy. – webternals

Odpowiedz

1

spróbować tak,

curl_init('XXX.XXX.XXX.XXX'); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host: subdomain.hostname.com')); 
+0

To nie działa ... – DharanBro

+0

Spróbuj tego, $ ipaddress = 'desired_ip'; $ url = 'ścieżka/do/pliku?'; curl_init ("http: //'.$ipaddress.$url); –

+0

Pracuję z Windows i xampp .. czy to byłby z tym jakiś problem? – DharanBro

1

Jeśli używasz okna i xampp następnie spróbuj użyć wirtualnego hosta zamiast localhost, a następnie rozpocznie pracę, zrobiłem to samo.

+0

, jak korzystać z hosta wirtualnego – DharanBro

+0

sprawdź tutaj, aby skonfigurować host wirtualny http: // Sawmac. com/xampp/virtualhosts/ –

1

Według specyfikacji HTTP szybkiego odczytu, zakładam, że twoje problemy zdarzają się z powodu niewłaściwej Host nagłówek jest wysłać. Udało mi się pobrać niektóre witryny z następującym kodem:

function wget($url, $follow = true) { 

    $host = parse_url($url); 

    $agent  = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0.1'; 
    $curlHeaders = array(
     'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
     'Accept-Encoding: gzip, deflate', 
     'Accept-Language: en-US,en;q=0.5', 
     'User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0.1', 
     'Connection: Keep-Alive', 
     'Pragma: no-cache', 
     'Referer: http://example.com/', 
     'Host: ' . $host['host'] . (isset($host['port']) ? ':' . $host['port'] : null), // building host header 
     'Cache-Control: no-cache', 
     'Cookie: visid_incap_185989=9v1q8Ar0ToSOja48BRmb8nn1GFUAAAAAQUIPAAAAAABCRWagbDIfmlN9NTrcvrct; incap_ses_108_185989=Z1orY6Bd0z3nGYE2lbJ/AXn1GFUAAAAAmb41m+jMLFCJB1rTIF28Mg==; _ga=GA1.3.637468927.1427699070; _gat=1; frontend=rqg7g9hp2ht788l309m7gk8qi7; _gat_UA-1279175-12=1; __utma=233911437.637468927.1427699070.1427699078.1427699078.1; __utmb=233911437.2.10.1427699078; __utmc=233911437; __utmz=233911437.1427699078.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt_UA-1279175-1=1; _cb_ls=1; _chartbeat2=S0WVXDwMWnCFBgQp.1427699081322.1427699232786.1; PRUM_EPISODES=s=1427699568560&r=http%3A//example.com/' 
    ); 
    $ch   = curl_init(); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $curlHeaders); 
    curl_setopt($ch, CURLOPT_HEADER, TRUE); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $follow); // following redirects or not 
    curl_setopt($ch, CURLOPT_USERAGENT, $agent); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    $result  = curl_exec($ch); 
    return $result; 
} 

echo(wget('http://example.com')); 

W każdym razie ta funkcja nie jest uniwersalna. Osobiście dodawałbym zapisywanie plików cookie między żądaniami przekierowania itp. Niezbędna zmiana znajduje się w linii nagłówka "Host". Buduję tam odpowiedni nagłówek Host oparty na pełnej $url dostarczonej do funkcji.

+0

Stwierdziłem, że strona internetowa, którą próbuję skrobać, używa JS do sprawdzania/sprawdzania, czy żądanie jest wysyłane przez przeglądarkę. jeśli otworzy się w przeglądarce, hostem jest example.com i ładuje plik "example.com/verify.js". Więc jeśli żądanie jest wysyłane przez przeglądarkę, ładuje się do 'localhost/verify.js'. Wcześniej powyższy kod zwraca javascript, który mógłbym zobaczyć w elemencie inspekcji przeglądarki. – DharanBro

+0

@DharanBro Całkiem nie rozumiem twojego komentarza. Czy działa lub nadal ma pewne problemy? – yergo

+0

To nie działa. – DharanBro

3

Zakładając jesteśmy nie próbuje sfałszować nagłówek Host pominąć nagłówek Host całkowicie i niech curl układać. W takim przypadku po prostu usuń 'Host: hostname',, ponieważ już dostałeś curl, aby automatycznie ustawić to z kodem blisko dna przy pomocy curl_setopt($ch, CURLOPT_URL, $url);.

Jeśli naprawdę chcesz, aby ustawić nagłówek samodzielnie Host, a potem po prostu zastąpić

'Host: hostname', 

z

"Host: ". parse_url($url, PHP_URL_HOST),

. (Uwaga: Funkcja ta nie działa z względnych adresów URL)