wernerz2 wrote:klar ist eine Firewall Schuld, dass der Server nicht ins Internet kommt, dass soll aber auch so sein. Ist schließlich ein Intranet.
Dann muss man eben eine Ausnahme in der FIrewall definieren, dafür sind die ja konfigurierbar.
Ich habe mir das ganze Konstrukt noch einmal durch den Kopf gehen lassen, jetzt verstehe ich auch wirklich, was gesucht ist. Das Problem besteht darin, dass Apache selbst überhaupt nichts ins Internet geht, die Zugriffe aus dem Forenscript werden direkt von PHP selbst durchgeführt, d.h. es wird ein direkter TCPIP Request für HTTP von PHP durchgeführt. Es wird NICHT "oben herum" via Apache zugegriffen, Apache bekommt überhaupt nichts davon mit, dass das Forenscript einen Request ausführt. Und deswegen gibt es auch keine Möglichkeit, irgendetwas in Apache zu konfigurieren, damit diese Requests via irgendeinen Proxy geschehen.
Wenn die Firewall nicht angepasst werden darf, bleiben also nur noch 2 Lösungsmöglichkeiten:
1) Im Forenscript nachschauen, ob diese Zugriffe unbedingt erfolgen (was eigentlich komisch wäre), oder ob es konfigurierbar ist, dass das Script diese Requests überhaupt versucht. Das ist ja eigentlich ein Standard bei vielen Softwareprodukten, dass sie (nur auf Wunsch) automatisiert nach Updates suchen. Und Timeouts dauern natürlich relativ lange, weswegen es eigentlich normal wäre, wenn man diese "Dienste" optional ausführen kann. Das wäre das erste, was ich suchen würde, ob man das einfach abstellen kann.
2) Ansonsten, wenn es nicht geht, den Zugriff via Proxy in das Forenscript einprogrammieren. Das Forenscript bedient sich ja irgendeiner API (ggf. via Curl oder so, vielleicht auch direkte TCPIP Verbindungen via fsockopen(), oder vielleicht auch einfache Dateifunktionen mit URLs und aktiviertem URL-Wrapper, das muss man eben nachschauen) und den normalen GET aus dem HTTP Request durch einen entsprechenden Request auf den Proxy ersetzen. Ich habe bei php.net auf der Doku von fsockopen() eine komplette PHP Klasse gefunden, die genau das tut, was Du suchst, nämlich aus einem Intranet via Proxy einen HTTP Request nach außen absetzen. Ich kopiere das mal hier rein:
- Code: Select all
If you have to use a proxy to make requests outside of your local network, you may use this class:
<?php
/*
*
* No Proxy Authentification Implemented; PHP 5
*
*/
class RemoteFopenViaProxy {
private $result;
private $proxy_name;
private $proxy_port;
private $request_url;
public function get_proxy_name() {
return $this->proxy_name;
}
public function set_proxy_name($n) {
$this->proxy_name = $n;
}
public function get_proxy_port() {
return $this->proxy_port;
}
public function set_proxy_port($p) {
$this->proxy_port = $p;
}
public function get_request_url() {
return $this->request_url;
}
public function set_request_url($u) {
$this->request_url = $u;
}
public function get_result() {
return $this->result;
}
public function set_result($r) {
$this->result = $r;
}
private function get_url_via_proxy() {
$proxy_fp = fsockopen($this->get_proxy_name(), $this->get_proxy_port());
if (!$proxy_fp) {
return false;
}
fputs($proxy_fp, "GET " . $this->get_request_url() . " HTTP/1.0\r\nHost: " . $this->get_proxy_name() . "\r\n\r\n");
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;
}
private function get_url($url) {
$fd = @ file($url);
if ($fd) {
return $fd;
} else {
return false;
}
}
private function logger($line, $file) {
$fd = fopen($file . ".log", "a+");
fwrite($fd, date("Ymd G:i:s") . " - " . $file . " - " . $line . "\n");
fclose($fd);
}
function __construct($url, $proxy_name = "", $proxy_port = "") {
$this->set_request_url($url);
$this->set_proxy_name($proxy_name);
$this->set_proxy_port($proxy_port);
}
public function request_via_proxy() {
$this->set_result($this->get_url_via_proxy());
if (!$this->get_result()) {
$this->logger("FAILED: get_url_via_proxy(" . $this->get_proxy_name() . "," . $this->get_proxy_port() . "," . $this->get_request_url() . ")", "RemoteFopenViaProxyClass.log");
}
}
public function request_without_proxy() {
$this->set_result($this->get_url($this->get_request_url()));
if (!$this->get_result()) {
$this->logger("FAILED: get_url(" . $url . ")", "RemoteFopenViaProxyClass.log");
}
}
}
?>
Use it this way:
<?php
// call constructor
$obj = new RemoteFopenViaProxy($insert_request_url, $insert_proxy_name, $insert_proxy_port);
// change settings after object generation
$obj->set_proxy_name($insert_proxy_name);
$obj->set_proxy_port($insert_proxy_port);
$obj->set_request_url($insert_request_url);
$obj->request_via_proxy();
echo $obj->get_result();
?>
If there are errors during execution, the script tries to write some useful information into a log file.
Diese Klasse musst Du in das Forenscript einbinden und dann die notwendigen Requests gemäß des unten angeführten Syntaxbeispiels anpassen. Dann hast Du eine komplette Lösung inkl. Proxyzugriff. Sicherlich könnte man das auch via Curl programmieren, aber diese Klasse ist ja auch einfach zu bedienen.