Apache als "Proxy-Client"

Alles, was den Apache betrifft, kann hier besprochen werden.

Apache als "Proxy-Client"

Postby -eraz- » 05. May 2008 08:55

Hallo,

ich bin gerade am basteln einer Webseite für unser INTRANET.
Ich habe einen Webserver mit Solaris10, Apache2, PHP5 und folgdem Problem:

In der Webseite möchte ich einen RSS Feed von einer externen Seite aus dem Internet einbinden. Allerdings haben wir in der Firma einen Proxyserver, welcher über einen bestimmten Port HTTP Requests annimmt und auch eine Authentifizierung erfordert.
Der Webserver der IN unserem Netzwerk steht kann den eingebundenen RSS Feed von außerhalb also nicht anzeigen da er über unseren Proxy nicht drüberkommt. Kann ich Apache irgendwie so konfigurieren das er unseren Proxy für Anfragen nach außen benutzt?
-eraz-
 
Posts: 6
Joined: 05. May 2008 08:46

Postby -eraz- » 06. May 2008 15:54

weiß das echt keiner? ist ja eigentlich nicht sowas ungewöhnliches oder?
-eraz-
 
Posts: 6
Joined: 05. May 2008 08:46

Postby Nobbie » 06. May 2008 16:06

Sagen wir so - ich glaube nicht, dass die Frage irgendeiner verstanden hat. Ist ziemlich wirr beschrieben.
Nobbie
 
Posts: 13165
Joined: 09. March 2008 13:04

Postby -eraz- » 07. May 2008 07:13

hmm... ok, ich hab das mal mit Visio ein bisschen dargestellt.
Image

Wie gesagt stellt die Quelle einfach nur mehrere RSS Feeds zur Verfügung, siehe http://feeds.reuters.com/reuters/topNews

Dieser Feed soll als eingebundener Frame in der Intranetseite gezeigt werden. Scheitert aber eben an unserem Proxy...
-eraz-
 
Posts: 6
Joined: 05. May 2008 08:46

Postby Nobbie » 07. May 2008 11:00

Das geht nicht mit Apache-Mitteln (proxypass o.ä.), dazu mußt Du ein PHP-Script schreiben, welches direkt auf den Proxy zugreift, mit user+password und den Proxy den entsprechenden Request ausführen läßt.

Ich habe hier mal ein Beispielscript, wie so eine PHP Funktion aussehen kann, die so etwas tut. Dieser gibt man die URL mit, die man im Internet lesen will und sie liefert den Seiteninhalt zurück. Die Konfigurationsdaten (IP des Proxys, User und Passwort) mußt Du statisch am Anfang des Scripts einstellen, hier stehen jetzt irgendwelche Daten:

Code: Select all
<?php
function proxy_url($proxy_url)
{
   $proxy_name = '127.0.0.1';
   $proxy_port = 4001;
   $proxy_user = "user";
   $proxy_pass = "password";
   $proxy_cont = '';

   $proxy_fp = fsockopen($proxy_name, $proxy_port);
   if (!$proxy_fp)    {return false;}
   fputs($proxy_fp, "GET $proxy_url HTTP/1.0\r\nHost: $proxy_name\r\n");
   fputs($proxy_fp, "Proxy-Authorization: Basic " . base64_encode ("$proxy_user:$proxy_pass") . "\r\n\r\n");    // added
   while(!feof($proxy_fp)) {$proxy_cont .= fread($proxy_fp,4096);}
   fclose($proxy_fp);
   $proxy_cont = substr($proxy_cont, strpos($proxy_cont,"\r\n\r\n")+4);
   return $proxy_cont;
}
?>


Das Script mußt Du anpassen und mit den richtigen URLs aufrufen und in Deine Seite einbauen. Im Zusammenhang mit RSS Feeds habe ich es noch nicht getestet, da ist ja noch das zusätzliche Problem, dass das kein HTML ist sondern XML. Das muss dem Browser ja mitgeteilt werden, sonst stellt er es falsch dar. Möglicherweise muss man mit der header()-Funktion auch noch den Content-Type anpassen.

Also trivial ist das ganz und gar nicht - da brauchts Dich nicht zu wundern, wenn niemand antwortet.
Nobbie
 
Posts: 13165
Joined: 09. March 2008 13:04

Postby -eraz- » 07. May 2008 12:59

Danke!! Ja ich merk grad dass das nicht so trivial ist. Mit meinen Hobbymäßigen Programmierkenntnissen habe ich mal die funktion dazugefummelt, aber es geht halt leider trotzdem nicht. Ich kopier mal den Code rein (auch wenn ich nicht mehr viel Hoffnung habe dass das noch laufen wird. *g*)

Code: Select all
<?php

// Klasse zum Lesen von RSS-Feeds

error_reporting(E_ERROR | E_PARSE);

class RSSFeed {
   var $title;                        // Alle Titel
   var $link;                        // Alle Links
   var $description;                  // Alle Beschreibungen   
   var $newscount;                     // Anzahl der Elemente
   var $xml;                        // Plaintext XML Dokument
   var $trans_tbl;                     // HTML-Konvert-Tabelle
   
   var $feedurl="http://feeds.reuters.com/reuters/topNews";                  // Feed-URL
   var $cachefile="0000009a950836798.txt";            // Lokaler Cache
   var $bulletfile="bu0000009a950836798.gif";                  // Bullet-Grafik
   var $proxy_url="http://feeds.reuters.com/reuters/topNews";
   
   var $expire=300;                  // Refresh-Zeit in Sekunden
   var $maxnewscount=-5;               // Maximale Anzahl von Einträgen
   var $footer="";                     // Text unterhalb des Feeds
   var $errortext="Error accessing Feed";   // Fehlermeldung
   var $showdescription=1;               // Description anzeigen
   var $sidebarmode=0;                  // Sidebar-Modus
   
   function RSSFeed() {
      // Klassen-Konstruktor
   
      // Die unhtmlentities-Funktion vorbereiten
      $this->trans_tbl = get_html_translation_table(HTML_ENTITIES);
         $this->trans_tbl = array_flip($this->trans_tbl);
   }
   
   function file_is_uptodate() {
      // Datei-Zeit checken

      if (file_exists($this->cachefile)) {
         if (time()-filemtime($this->cachefile)<$this->expire) {
            return TRUE;
         }
      }
      return FALSE;
   }
   
   function read_file() {
      // Cache-File lesen
      
      unset($this->xml);
      $handle = fopen($this->cachefile, "r");
      if ($handle) {
         flock($handle, LOCK_SH);
         $this->xml = fread($handle, filesize($this->cachefile));
         flock($handle, LOCK_UN);
         return TRUE;
      } else {
         return FALSE;
      }
   }
   
   function write_file() {
      // Cache-File schreiben
      
      $handle = fopen($this->cachefile, "w+");
      flock($handle, LOCK_EX);
      fwrite($handle, $this->xml);
      flock($handle, LOCK_UN);
      fclose($handle);
   }
   
   
   function proxy_url($proxy_url) {
      
      $proxy_name = 'proxy.xxxx.xxxx.at';
      $proxy_port = 8080;
      $proxy_user = "xxx\xxx";
      $proxy_pass = "xxx";
      $proxy_cont = '';

      $proxy_fp = fsockopen($proxy_name, $proxy_port);
         if (!$proxy_fp)    {return false;}
         fputs($proxy_fp, "GET $proxy_url HTTP/1.0\r\nHost: $proxy_name\r\n");
         fputs($proxy_fp, "Proxy-Authorization: Basic " . base64_encode ("$proxy_user:$proxy_pass") . "\r\n\r\n");    // added
         while(!feof($proxy_fp)) {$proxy_cont .= fread($proxy_fp,4096);}
         fclose($proxy_fp);
      $proxy_cont = substr($proxy_cont, strpos($proxy_cont,"\r\n\r\n")+4);
         return $proxy_cont;
   }
      
   
   
   function read_url() {
      // URL lesen
      
      unset ($this->xml);
      
      $handle = fopen($this->feedurl, 'r');
      if ($handle) {
         while (!feof($handle)) {
            $this->xml .= fread($handle, 128);
         }
         fclose($handle);
         return TRUE;
      } else {
         return FALSE;
      }
   }

   function find_tag($string, $tag) {
      // Tag finden
      
      $tmpval = array();
      $preg = "|<$tag.*?>(.*?)</$tag>|s";

      preg_match_all($preg, $string, $tags);
      foreach ($tags[1] as $tmpcont){
         $tmpval[] = $tmpcont;
      }
      return $tmpval;
   }
   
   function unhtmlentities($string) {
      // entfernt HTML-Entitites   
      
         return strtr($string, $this->trans_tbl);
   }
   
   function remove_cdata($text,$removeentities) {
      // Die CDATA-Tags entfernen
   
      $text=str_replace("<![CDATA[","",$text);
      $text=str_replace("]]>","",$text);
      if ($removeentities) {
         $text=$this->unhtmlentities($text);
      }
      return $text;
   }

   function parse_feed() {   
      // Den Feed interpretieren

      // Alles auf Null
      $this->newscount=0;
      unset($this->title);
      unset($this->link);
      unset($this->description);
      
      // Ist es ein UTF-8-Feed?      
      $utf=preg_match('|<\?xml.*?encoding\s*?=\s*?"\s*?UTF-8\s*?".*?>|i',$this->xml);
      
      // Alle Items finden
      $items = $this->find_tag($this->xml, 'item');
      
      // Die Items durchlaufen
      foreach ($items as $item) {
         $this->newscount++;

         // Titel, Link und Beschreibung extrahieren
         $title=$this->find_tag($item, 'title');
         $link=$this->find_tag($item, 'link');
         $description=$this->find_tag($item, 'description');
         
         // In Array schreiben und ggf. UFT-8 transformieren
         if ($utf) {
            $this->title[$this->newscount] = $this->remove_cdata(utf8_decode($title[0]),true);
         } else {
            $this->title[$this->newscount] = $this->remove_cdata($title[0],true);
         }
         if ($utf) {
            $this->description[$this->newscount] = $this->remove_cdata(utf8_decode($description[0]),true);
         } else {
            $this->description[$this->newscount] = $this->remove_cdata($description[0],true);
         }
         $this->link[$this->newscount] = $this->remove_cdata($link[0],false);
         
         // Hat da einer den Titel vergessen?
         if ($this->title[$this->newscount]=="") {
            $this->title[$this->newscount]=$this->link[$this->newscount];
         }
      }
   }

   function print_html() {
      // Als HTML ausgeben
      
      if ($this->sidebarmode) {
         for ($i=1;(($i<=$this->newscount) && (($i<=$this->maxnewscount) || ($this->maxnewscount<=0)));$i++) {
            echo('<p>');
            echo('<a target="_blank" href="'.$this->link[$i].'">'.$this->title[$i].'</a>');
            echo('</p>');
            if ($this->description[$i] && $this->showdescription) {
               echo ('<p>'.$this->description[$i].'<br></p>');
            }
         }
         if ($this->footer) {
            echo('<p align="right">'.$this->footer.'</p>');
         }
      } else {
         echo('<table width="100%" border="0" cellpadding="0" cellspacing="0">');
         for ($i=1;(($i<=$this->newscount) && (($i<=$this->maxnewscount) || ($this->maxnewscount<=0)));$i++) {
            echo('<tr>');
            echo('<td><img src="'.$this->bulletfile.'" border=0 alt=""></td>');
            echo('<td width=100%>');
            echo('<a class="s2d" target="_blank" href="'.$this->link[$i].'">'.$this->title[$i].'</a>');
            echo('</td></tr>');
            if ($this->description[$i] && $this->showdescription) {
               echo ('<tr><td></td><td>');
               echo ('<p>'.$this->description[$i].'<br></p>');
               echo ('</td></tr>');
            }
         }
         if ($this->footer) {
            echo('<tr><td></td><td><p align="right">'.$this->footer.'</p></td></tr>');
         }
         echo('</table>');
      }
   }
   
   function process_feed() {
      // All in one: Den Feed lesen, cachen, ausgeben
      
      $valid=FALSE;
         
      if ($this->file_is_uptodate()) {
         // Cache war nach aktuell
         $valid=($this->read_file());
      } else {
         // Nicht mehr aktuell
         if ($this->read_url()) {
            // URL lesen und schreiben
            $this->write_file();
            $valid=TRUE;
         }
      }
      
      if ($valid) {
         // Wenn alles o.k. ausgeben
         $this->parse_feed();
         $this->print_html();
      } else {
         echo ("<p>".$this->errortext."</p>");
      }
   }
}
?>
-eraz-
 
Posts: 6
Joined: 05. May 2008 08:46

Postby Nobbie » 07. May 2008 14:17

Und nun?

Jetzt hast Du eine Klasse (die Du wahrscheinlich auch irgendwo heruntergeladen hast) um die Methode proxy_url erweitert. Aber aufgerufen wird sie nirgends - dann braucht man sie auch nicht einzufügen.

Das ist sicherlich ein paar Hausnummern zu groß für Dich - lass das mal jemanden in Eurer Firma machen, der programmieren kann. So wird das sonst nichts.
Nobbie
 
Posts: 13165
Joined: 09. March 2008 13:04

Postby -eraz- » 07. May 2008 14:36

Wie freundlich von Dir...
Scheint ja nicht nur für mich ein paar Hausnummern zu groß zu sein. :roll:
-eraz-
 
Posts: 6
Joined: 05. May 2008 08:46

Postby Nobbie » 07. May 2008 15:20

-eraz- wrote:Wie freundlich von Dir...
Scheint ja nicht nur für mich ein paar Hausnummern zu groß zu sein. :roll:


Das ist ganz sicher so.

Ich wüßte schon, wie man es einbaut - aber ich wüßte nicht, warum ich einer Firma helfen sollte für lau? Der entscheidende Hinweis kommt ja schon von mir, aber jetzt auch noch das Script anzupassen einfach so - das finde ich unangemessen.
Nobbie
 
Posts: 13165
Joined: 09. March 2008 13:04

Postby -eraz- » 08. May 2008 11:02

Nobbie wrote:aber ich wüßte nicht, warum ich einer Firma helfen sollte für lau?

Gut, gib mir deine Kontonummer ich lasse 10,- Euro überweisen :roll:
Ne lass mal, dann eben nicht...
-eraz-
 
Posts: 6
Joined: 05. May 2008 08:46

Postby Nobbie » 08. May 2008 12:49

Tut mit aufrichtig Leid, überhaupt geholfen zu haben.

Du bist das Bilderbuchbeispiel für Undankbarkeit - anstatt sich für den (sehr wertvollen) Hinweis und das ebenso wertvolle Scriptbeispiel zu bedanken, pampst Du auch noch dämlich herum, weil ich Dir das (ebenfalls nicht selbst geschriebene) Script vollständig anpasse und ans Laufen bringe.

Echt klasse.
Nobbie
 
Posts: 13165
Joined: 09. March 2008 13:04


Return to Apache

Who is online

Users browsing this forum: No registered users and 226 guests