Хватит завивать сброс номера порта - PullRequest
1 голос
/ 31 мая 2011

Когда я скручиваю следующее

<?php

$ch = curl_init();
curl_setopt ($ch, CURLOPT_PORT, "8081");
curl_setopt ($ch, CURLOPT_URL, "http://192.168.0.14:8081/comingEpisodes/" );
curl_setopt($ch, CURLOPT_USERPWD, "user:pass");
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$curl_response = curl_exec($ch);
curl_close($ch);

echo $curl_response;
?>

Страница возвращается, а изображения нет.Я нашел проблему.192.168.0.14 - мой локальный хост.Я вызываю страницу из приложения с портом запуска 8081. Кажется, что Curl отбрасывает порт и меняет 192.168.0.14 на locahost, и поэтому изображения больше не связаны с нужным местом.Как сделать так, чтобы порт оставался таким, чтобы оставались изображения.Спасибо

РЕДАКТИРОВАТЬ: Я думаю, что / ближайшиеEpisodes после порта также является частью проблемы ..

1 Ответ

3 голосов
/ 31 мая 2011

Если вы не создаете 100% -ый прокси, вы сбрасываете содержимое cURL в браузер.Теперь результаты ссылаются на страницу, на которую выводятся результаты cURL, а не на исходный запрос cURL.

Обычно, если вы посещаете http://localhost, а указанный выше код находится в index.php,эта страница запрашивает содержимое: 8081 / comingEpisodes и выгружает его в контексте исходного http://locahost. Браузер теперь базирует все найденное содержимое из http://localhost, а не какесли бы это было из запроса curl.

Вы могли бы заменить все ссылки на содержимое в документе, прежде чем он будет выведен на какой-нибудь proxy.php? retrieve = old_url, а затем сделать все это сейчасвызывать через тот же контекст cURL, но это основа веб-прокси.

End-User               Intermediary              End-Website
(http://localhost)     (localhost/index.php)     (http://192.168.0.14:8081/comingEpisodes/)
------------------     ---------------------     ------------------------------------------
Initial visit--------->
                       cURL Request------------->
                                                 Page Content (html basically)
                       Echoed back to user<------
Content<---------------
Finds <img> etc.------>
                       /comingEpisodes/img1.jpg  // 404 error, it's actually on :8081
                                                 // that localhost has no idea about
                                                 // because it's being hidden using cURL

ОЧЕНЬ ПРОСТО ДЕМО

<?php
  //
  // Very Dummied-down proxy
  //

  // Either get the url of the content they need, or use the default "page root"
  // when none is supplied. This is not robust at all, as this really only handles
  // relative urls (e.g. src="images/foo.jpg", something like src="http://foo.com/"
  // would become src="index.php?proxy=http://foo.com/" which makes the below turn
  // into "http://www.google.com/http://foo.com/")
  $_target = 'http://www.google.com/' . (isset($_GET['proxy']) ? $_GET['proxy'] : '');

  // Build the cURL request to get the page contents
  $cURL = curl_init($_target);
  try
  {
    // setup cURL to your liking
    curl_setopt($cURL, CURLOPT_RETURNTRANSFER, 1);

    // execute the request
    $page = curl_exec($cURL);

    // Forward along the content type (so images, files, etc all are understood correctly)
    $contentType = curl_getinfo($cURL, CURLINFO_CONTENT_TYPE);
    header('Content-Type: ' . $contentType);

    // close curl, we're done.
    curl_close($cURL);

    // test against the content type. If it HTML then we need to re-parse
    // the page to add our proxy intercept in the URL so the visitor keeps using
    // our cURL request above for EVEYRTHING it needs from this site.
    if (strstr($contentType,'text/html') !== false)
    {
      //
      // It's html, replace all the references to content using URLs
      //

      // First, load our DOM parser
      $html = new DOMDocument();
      $html->formatOutput = true;
      @$html->loadHTML($page); // was getting parse errors, added @ for demo purposes.

      // simple demo, look for image references and change them
      foreach ($html->getElementsByTagName('img') as $img)
      {
        // take a typical image:
        //   <img src="logo.jpg" />
        // and make it go through the proxy (so it uses cURL again:
        //   <img src="index.php?proxy=logo.jpg" />
        $img->setAttribute('src', sprintf('%s?proxy=%s', $_SERVER['PHP_SELF'], urlencode($img->getAttribute('src'))));
      }

      // finally dump it to client with the urls changed
      echo $html->saveHTML();
    }
    else
    {
      // Not HTML, just dump it.
      echo $page;
    }
  }
  // just in case, probably want to do something with this.
  catch (Exception $ex)
  {
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...