hotti: Redirect aus Ajax heraus

Mahlzeit,

Hintergrund: für den Fall, dass mein DB-Server down ist, habe ich ein CGI (fallback.cgi) was geladen wird und den Besucher erklärt was nicht geht.

In dieses CGI habe ich nun Ajax eingebaut was mit window.timeout() alle 5 Sekunden prüft, ob der DB-Server wieder tut. Wenn ok, kriegt der Besucher den Status und einen Link zur Startseite, soweit tut alles.

Nun wollte ich das für den Besucher weiter vereinfachen, also anstelle den Link zu zeigen, gleich eine Umleitung auf die Startseite machen. Das tut auch, jedoch wird alles, was fallback.cgi vorher an HTML ausgegeben hat noch einmal gezeigt, einschließlich <head>..<title></title>..</head>. head ist seltsamerweise nur einmal da, auch </body></html>. Innerhalb <body></body> findet sich exact die Seite zu der umgeleitet wurde.

WTF. Ideean?

Hotte

--
Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  1. Wie sieht Deine Umleitung denn aus - verwendest Du location.href?

    Gruß, LX

    --
    RFC 1925, Satz 8: Es ist komplizierter als man denkt.
    1. Wie sieht Deine Umleitung denn aus - verwendest Du location.href?

      Ausnahmsweise hau ich hier mal den ganzen Code rein, ist ja nicht viel. Hab nochmal genau hingeschaut, auch im Quellcode ist nach der Umleitung die Startseite vollständig zu lesen. Irgendwas bleibt da im Browser "hängen"... und ist nach dem Reload wech!!!

      Wer testen möchte, die iniDatei wird hier nur gebraucht für die Credentials zur MySQL-Anbindung (user, pass, host, port).

      Danke schonmal,
      wenn das geht, *.*
      Hotti

      ===================== alles, sorry ========================================

      #!/usr/bin/perl
      ###########################################################################

      Falls MySQL nicht zur Verfügung steht

      und mod rewrite noch eingeschaltet ist

      greift dieses Script

      Pfad und Name der iniDatei

      my $inifile = '/home/netsh100633/html/cgi-bin/basic.ini';

      ###########################################################################
      use strict;
      use DBI;
      use CGI 'param';
      use Config::IniFiles;
      use URI::Escape;

      my $cfg = getvars($inifile);

      if(param('dbase')){
      # Versuche die Datenbankanbindung
      if(my $dbh = dbase()){
      # print "Content-type: text/html\n\n";
      # print uri_escape(qq(Der Server ist wieder erreichbar, bitte klicken Sie <a href="/" title="Zur Startseite">hier für einen erneuten Versuch</a>.));
      redirect("/");
      }
      else{
      print "Content-type: text/html\n\n";
      print "Der Datenbankserver ist zur Zeit nicht erreichbar.";
      }
      exit;
      }
      else{
      print "Content-type: text/html\n\n";
      print qq(
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
      <HTML lang="de">
      <HEAD>
      <LINK REL="stylesheet" HREF="/nv.css" TYPE="text/css">
      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
      <META NAME="Author" CONTENT="Rolf Rost">
      <meta name="description" content="Vorübergehend keine Datenbankanbindung">

      		<TITLE>Keine Datenbankanbindung</TITLE>  
      
      		<script type="text/javascript">  
      			// Erstelle ein Objekt für Ajax-Requests  
      			var maob = mob();  
      			function mob(){  
      				var mob = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");  
      				return mob;  
      			}  
      		</script>  
      
      
      
      		</HEAD>  
      		<BODY onload="mob()">  
      
      	<h1>Keine Datenbankanbindung</h1>  
      
      	<p>Vorübergehend stehen alle Dienste der Domäne rolfrost.de mit Datenbankanbindung nicht zur Verfügung. Bitte versuchen Sie es später erneut, das Problem wurde bereits erkannt, an der Lösung wird zeitnah gearbeitet.</p>  
      	  
      	<p>Sofern JavaScript im Browser aktiviert ist, sehen Sie den Status der Datenbankanbindung untenstehend, lassen Sie dazu einfach das Fenster geöffnet.</p>  
      
      	<div id="dbstatus"> </div>  
      	  
      	<script type="text/javascript">  
      
      
      	function request(){  
      		var url = '/cgi-bin/fallback.cgi?dbase=1';  
      		maob.open("GET", url, true);  
      		maob.send(null);  
      		maob.onreadystatechange = response;		}  
      
      	function response(){  
      		if(maob.readyState == 4){  
      			if(maob.status == 200){  
      				document.getElementById('dbstatus').innerHTML = unescape(maob.responseText);  
      			}  
      			else{  
      				document.getElementById('dbstatus').innerHTML = "Der Status der DB konnte nicht ermittelt werden.";  
      			}  
      		}  
      	}  
      
      	window.setInterval("request()", 5000);  
      
      	</script>  
      	  
      	  
      	  
      
      	</body>  
      	</html>  
      );  
      

      }

      exit;
      ###########################################################################
      ###########################################################################

      einfache Umleitung

      sub redirect{
      my $url = shift;
      print "Status: 302 Moved\n";
      print "location: $url\n\n";
      return;
      }
      ###########################################################################

      Versuche eine Verbindung zur Datenbank

      sub dbase{
      my $dsn = "DBI:mysql:database=$$cfg{mysql}{base};host=$$cfg{mysql}{host};port=$$cfg{mysql}{port}";
      my $dbh = DBI->connect($dsn, $$cfg{mysql}{user}, $$cfg{mysql}{pass}) || return;
      return $dbh;
      }
      ###########################################################################

      die basic.ini einlesen

      sub getvars{
      my $inifile = shift;
      # hash mit Variablen binden
      my %vars;
      tie %vars, 'Config::IniFiles', ( -file => $inifile );
      return %vars;
      }
      ###########################################################################
      __END__

      1. Hi,

        Wie sieht Deine Umleitung denn aus - verwendest Du location.href?

        Ausnahmsweise hau ich hier mal den ganzen Code rein, ist ja nicht viel.

        Ich sehe dich im JavaScript-Code überhaupt keine "Umleitung" machen -

        Hab nochmal genau hingeschaut, auch im Quellcode ist nach der Umleitung die Startseite vollständig zu lesen. Irgendwas bleibt da im Browser "hängen"... und ist nach dem Reload wech!!!

        • sondern jeweils nur den responseText der Serverantwort ins Dokument einfügen.

        Die serverseitige Umleitung per Location-Header, die steht aber nicht im Response Body der ausgelieferten Ressource, sondern in den Response Headern - auf die du aber gar nicht reagierst in deinem JS-Code, der die Antwort auf den XMLHttpRequest handeln soll.

        Wenn du eine Resssource im Hintergrund per AJAX anforderst, dann wird auch auf Redirects i.a.R. "im Hintergrund" reagiert. D.h., der Umleitung wird gefolgt, und deren Ergebnis bekommt dann dein JavaScript zurück - was ja auch vernünftig ist, denn beim AJAX-Scripten will man sich normalerweise nicht auch noch selber um so 'n Kram wie Redirects, Caching etc. kümmern. Das alles selber zu implementieren, wäre zu viel Aufwand.

        Das bedeutet aber auch, dass dein Redirect nicht wie ein "normaler" vom Browser behandelt wird (werden kann), wie es beim Aufruf einer Ressource auf dem "normalen" Wege über die Adresszeile o.ä. der Fall ist.

        Wenn du das mit AJAX machen willst - dann lasse dein serverseitiges Script nicht umleiten, sondern eine (Text-)Ausgabe machen, an Hand derer dein JS erkennt, dass es selber umleiten soll (und zwar mittels des bereits erwähnten location.href).

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. hi,

          Wenn du das mit AJAX machen willst - dann lasse dein serverseitiges Script nicht umleiten, sondern eine (Text-)Ausgabe machen, an Hand derer dein JS erkennt, dass es selber umleiten soll (und zwar mittels des bereits erwähnten location.href).

          Ach ich Depp. Freilich kann das nur so gehen. Und es geht erstklassig!!!!

          Danke!
          Hotte

          --
          Mist, auch das noch: ne Zecke.
          1. Zum Angucken:

            Ganz unten im Artikel

            Vielen Dank,
            Hotte

            --
            Zecke is raus.