PHP redirect wenn Server down

Iv0ry

Cadet 3rd Year
Registriert
Jan. 2007
Beiträge
34
Hi Leute,

wir haben eine private Domain (Hauptnutzung E-Mail) und einem kleinen Blog (bei Strato falls relevant). Dort liegt ebenfalls ein Link zu unserem "Intranet" (Einer Website auf einem lokalem Webserver im Heimnetz (Rapsi) mit lokalen Links und Adressen. Da der kleine Raspi nicht immer läuft, läuft die Intranetseite ebenfalls auf dem NAS (Webserver). Was ich nun möchte ist, wenn der Rapsi offline ist, dass dann auf die andere (gleiche) Seite umgeleitet wird.

Raspi: 192.168.1.1
NAS: 192.168.1.2

Ich hatte dazu folgende Scripts gefunden, aber leider scheint keins zu funktionieren, habt Ihr eine Idee?


Die robots.txt existiert auf beiden Servern.

1)
Code:
<?php
//$srv1= "192.168.1.1";
$srv1 = "www.seitegibtesnicht.de/"; // zum testen
$srv2 = "192.168.1.2"; 
$check = @fsockopen($srv1, 80);
if ($check) {
@fclose($check);
header("Location: http://$srv1");
exit;
}else{
header("Location: http://$srv2");
}
?>

2)
Code:
<?php
if (require("http://192.168.1.1/robots.txt")) {
  header ('Location: http://192.168.1.1/');
}
elseif (require("http://192.168.1.2/robots.txt")) {
  header ('Location: http://192.168.1.2/');
}
else {
  echo '
   // Fehlermeldung 
 ';
}
?>

3)
Code:
<?php
$check_url = "http://192.168.1.1/robots.txt"; // URL zum überprüfen
$connection = @fsockopen ($check_url, 80);
 
if (!$connection)
{
header( "refresh:5;url=http://192.168.1.2" );
echo 'Sie werden weitergeleitet, wenn nicht klicken Sie dazu <a href="http://192.168.1.2"> hier<aa ';
}
else
{
header( "refresh:5;url=http://192.168.1.1" );
echo 'Seite ist wieder erreichbar....';
exit();
}
?>

4)
Code:
<? 
$webhoster = "http://192.168.1.1/robots.txt"; 
$heimrechner = "http://192.168.1.2/robots.txt"; 
$testfile = "robots.txt"; 
$test=@fopen ($heimrechner.$testfile,"r"); 
if($test) { 
header("Location: $heimrechner"); 
} else { 
header("Location: $webhoster"); 
} 
?>

:freak:

Gruß
Ive
 
Zuletzt bearbeitet:
Wie schaut der Link auf der Internetseite aus? Welche PHP Version rennt dort? Schau mal ob die PHP Erweiterung "cURL" installiert ist.
 
Versuchs mal mit timeout für fsockopen:

PHP:
$srv1 = "www.seitegibtesnicht.de/"; // zum testen
$srv2 = "192.168.1.2"; 
if($socket =@ fsockopen($srv1, 80, $errno, $errstr, 3)) { // timeout nach 3 sec
	header("Location: http://$srv1");
	fclose($socket);
} else {
	header("Location: http://$srv2");
}

Edit: Das geht bei mir lokal und aufm server.
 
Zuletzt bearbeitet:
@Sparta8 PHP Version 5.6.30 - cURL support enabled - cURL Information 7.50.3
@TheSir Ja. klar. :)

@coolmodi: Funktioniert leider nicht wirklich, es wird direkt immer die 192.168.1.2 auch wenn die 192.168.1.1 online ist. Das Problem hatte ich auch mit den oberen Scripts

EDIT: @coolmodi: Wenn ich das Script auf einen lokalen Webserver im Heimnetz packe, funktioniert es, extern bei Strato jedoch nicht. Vermutlich weil extern die lokale Heimnetz IP nicht aufgelöst/aufgerufen werden kann, da es Serverseitig ausgeführt wird(?). :-/
 
Zuletzt bearbeitet:
Achso klar, die lokale IP ist natürlich nicht erreichbar von außerhalb :P

Dann musst du das mit JS lösen, da das beim Client ausgeführt wird. Ganz einfache Methode welche mir dafür gerade einfällt:

HTML:
<html>
<head>
<title>Redirect</title>
</head>
<body>

<span id="status">Teste server...</span>
<img style="display: none;" id="testbild" src="">

<script>
    var bild = document.getElementById("testbild");
    var server2getested = false;
    bild.onload = function() {
        if (!server2getested) {
            window.location.replace("http://server1");
        } else {
            window.location.replace("http://server2");
        }
    };
    bild.onerror = function() {
        if (!server2getested) {
            server2getested = true;
            bild.src = "http://server2/bild.jpg";
        } else {
            document.getElementById("status").innerHTML = "Kein server erreichbar!"; 
        }
    };
    bild.src = "http://server1/bild.jpg";
</script>
</body>
</html>

Das einfach in ne .html packen.
Wenn man die nun im intranet aufruft versucht es ein Bild "http://server1/bild.jpg" zu laden, falls das geht leitet es an diesen server weiter, falls nicht versucht es "http://server2/bild.jpg", und falls das auch nicht geht kommt "Kein server erreichbar!".

Sollte gehen, aber keine Garantie, es ist halb 4 und ich hab keine Lust mehr das zu testen ;)
 
Zuletzt bearbeitet:
Hey Coolmodi,

funktioniert 1A. Ich möchte mich daher herzlich bei Dir für deine Idee und Umsetzung bedanken. Eine kleine Anmerkung hätte ich noch, wenn der Raspi (192.168.1.1) nicht erreichbar ist dauert es ziemlich lange (ca. 10 Sekunden) bis die Weiterleitung auf die 192.168.1.2 erfolgt. Kann man dort einen Timeout von 3-6 Sekunden einbauen, um es zu beschleunigen?

Das Script habe ich doch korrekt angepasst, oder? :)


Code:
<html>
<head>
<title>Redirect</title>
</head>
<body>
 
<span id="status">Teste server...</span>
<img style="display: none;" id="testbild" src="">
 
<script>
    var bild = document.getElementById("testbild");
    var server2getested = false;
    bild.onload = function() {
        if (!server2getested) {
            window.location.replace("http://192.168.1.1/");
        } else {
            window.location.replace("http://192.168.1.2/");
        }
    };
    bild.onerror = function() {
        if (!server2getested) {
            server2getested = true;
            bild.src = "http://192.168.1.2/logo.png"; // logo.png hat nur 15 kB ist also ideal
        } else {
            document.getElementById("status").innerHTML = "Kein server erreichbar!"; 
        }
    };
    bild.src = "http://192.168.1.1/logo.png";
</script>
</body>
</html>


liegen Gruß und hab einen schönen Feiertag!
Ive
 
klar:

Code:
setTimeout(() => redirect(), 3000);


Edit:

Code:
<html>

<head>
  <title>Redirect</title>
</head>

<body>

  <span id="status">Teste server...</span>
  <img style="display: none;" id="testbild" src="">
  <img style="display: none;" id="testbild2" src="">

  <script>
    let bild = document.getElementById("testbild");
    let bild2 = document.getElementById("testbild2");

    let server1Failed = false;
    let server2Reachable = false;
    let timedOut = false;

    bild.onload = () => {
      window.location.replace("http://192.168.1.1/");
    }

    bild.onerror = () => {
      let server1Failed = true;
    }

    bild2.onload = () => {
      if (server1Failed || timedOut) {
        window.location.replace("http://192.168.1.2/");
      }

      server2Reachable = true;
    }

    setTimeout(() => {
      timedOut = true;
      
      if (server2Reachable) {
        window.location.replace("http://192.168.1.2/");
      } else {
        document.getElementById("status").innerHTML = "Kein server erreichbar!";
      }
    }, 3000);

    bild.src = "http://192.168.1.1/logo.png";
    bild2.src = "http://192.168.1.2/logo.png";
  </script>
</body>

</html>


Wenn Server 1 erreichbar, wird sofort umgeleitet.
Wenn Server 1 nicht erreichbar (es ein Error gab) und Server 2 geantwortet hat, wird sofort dorthin umgeleitet.

Wenn Server 2 vor Server 1 antwortet wird noch die 3 Sekunden auf Server 1 gewartet
- wenn Server 1 innerhalb dieser Zeit antwortet, leite dorthin um
- wenn Server 1 nicht antwortet, leite zu Server 2 um.

Wenn nach 3 Sekunden keiner Antwortet, zeige Fehlermeldung.

Sollte nach 3 Sekunden doch noch einer Antworten, leite zu diesem um.
 
Zuletzt bearbeitet:
Zurück
Oben