fopen() через прокси

Статус
В этой теме нельзя размещать новые ответы.

hitex

Новичок
fopen() через прокси

Веб-сервер находится в локалке за прокси-сервером (фрибсдшный сквид). Этот же прокси редиректит все запросы к себе на 80-ый порт из инета к веб-серверу в локалке. Прокси, как я понял настроен так жёстко, что веб-сервак может только отвечать на запросы к себе и посылать ответы в инет, а сам открывать соединения наружу не может. Так что когда функцией fopen() пытаюсь открыть какой-нибудь файл из инета, php выдает ошибку:

Warning: fopen(): php_hostconnect: connect failed in /usr/htdocs/site/download.php on line 3

и соответственно

Warning: fopen(http://85.21.79.31/fragment/frag009/frag009_-_01_andriesh_-_intro.mp3): failed to create stream: Bad file descriptor in /usr/htdocs/site/download.php on line 3

При этом загрузка методом POST работает, нормально.
Вобщем, хотелось бы узнать, можно ли как-нибудь это обойти, или по другому открыть файл.

P.S. Есть доступ к конфигам apache и php
 

biver

Новичок
Кстати столкнулся с такой же проблемой!
$file=@fopen("любой URL",r);
не работает!
Стоит winXP sp2, Apache2_win32, PHP5
Уже с месяц мучаюсь что поделать не знаю!
 

Positive

Новичок
Я через проксю делал через сокеты - конектишься на сокет, выдаешь ему запрос, получаешь ответ.

Функцию к сожалению потерял, т.к. было года 4 назад...
 

biver

Новичок
Вот код:
<?php
$link="http://www.yandex.ru/";
$fk= fopen($link,"r");
$text="";
if(!$fk) echo "ERROR";
else {
while(!feof($fk))$text.=fgets($fk,4096);
fclose($fk);
echo "it worked!!!";
}
echo $text;
?>

Выдает такое сообщение:

Warning: fopen(http://www.yandex.ru/) [function.fopen]: failed to open stream: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера. in C:\Apache\Apache2\htdocs\index.php on line 3

Fatal error: Maximum execution time of 30 seconds exceeded in C:\Apache\Apache2\htdocs\index.php on line 3

Хочу добавить что делается через проксю squid
Через сокеты пробовал, почти то-же самое!
PHPinfo() смотрел, вроде везде разрешено использование.

-~{}~ 30.03.06 08:38:

С $fp = fsockopen($hostname, 80, $errno, $errstr, 30);
то-же самое пишет, и в конце добавляет (10060) - что такое?!
И как с этим бороться?
Может нужно обращаться не на прямую на адрес а как нить через проксю? Доступ есть к httpd.conf и к php.ini
могу переставиить и все что угодно.
А когда в браузере пишешь тот же адрес все работает замечательно!
 

biver

Новичок
Так как же открыть http адрес если установлено:
Apache2, PHP5, и все под Виндой XP sp2 ???
 

Фанат

oncle terrible
Команда форума
biver
а за кросспостинг можно и по рукам получить...
 

Positive

Новичок
Подробнее:

1. Открываешь через сокет проксю (не хост, а проксю именно! на порт прокси).
2. Отправлешь ей GET запрос (подробно смотри HTTP1.0/1.1 в Google).
3. Она отдает данные, ты читаешь их все из того же сокета
4. Закрываешь сокет.

Если прокся требует автоизации, то посмотри еще в HTTP Auth стандарт, тогда добавится еще шаг 1а где ты авторизуешься на проксе перед GET-запросом.
 

biver

Новичок
Спасиба Разобрался я сам!
fopen(); Через проксю работать не будет!
Сделал через fsockopen();
Структура такая вот:
...........
$hostname = "адрес прокся";
$path = "http://www.yandex.ru/";
$fp = fsockopen($hostname, порт который слушает прокси, $errno, $errstr, 30);
...............
$headers = "GET $path HTTP/1.1\r\n";
......................

так вот работает!!!

-~{}~ 30.03.06 11:23:

Спасиба Positive, где же ты раньше то был?
Недели 2 назад. Я всю голову сломал!
 

Positive

Новичок
Вот примерчик (без авторизации):
Может там и ошибки есть синтаксические, не судите строго) главное что понятно КАК :)

Код:
   $host = 'адреспрокси.com'; 
   $port = '3128';  //порт прокси
   $url = 'http://www.domain.com/category/file.html';  // ссылка для скачки

   if ($fsock = @fsockopen($host, $port, $errno, $errstr)) 
   { 
      @fputs($fsock, "GET $url HTTP/1.1\r\n"); 
      @fputs($fsock, "HOST: $url_host\r\n");                   // $host надо выдрать из ссылки, можно жестко прописать
      @fputs($fsock, "Connection: close\r\n\r\n"); 

      $get_info = false; 
      while (!@feof($fsock)) 
      { 
         if ($get_info) 
         { 
            $version_info .= @fread($fsock, 1024); 
         } 
         else 
         { 
            if (@fgets($fsock, 1024) == "\r\n") 
            { 
               $get_info = true; 
            } 
         } 
      } 
      @fclose($fsock);
 

hitex

Новичок
не, не помогло. но за пример с сокетами спасибо :)
дело в том, что проксик не обслуживает соединения с адреса сервера. то есть запросы на 80-ый порт передаются обычному веб-серверу:
Not Found

The requested URL /index.html was not found on this server.
Apache/1.3.20 Server at (ip сервера) Port 80
виноват, неправильно сформулировал тему вопроса, но всё равно всем спасибо :)
 

Positive

Новичок
Честно говоря, ничего не понял )) что и куда не передается)
Директиву Host: отправляешь в скрипте?
 

_Bill

Новичок
А по-моему fopen с урлами не работает. Об это даже пост был...
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху