Redirect aus Ajax heraus
hotti
- html
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
Wie sieht Deine Umleitung denn aus - verwendest Du location.href?
Gruß, LX
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
###########################################################################
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;
###########################################################################
###########################################################################
sub redirect{
my $url = shift;
print "Status: 302 Moved\n";
print "location: $url\n\n";
return;
}
###########################################################################
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;
}
###########################################################################
sub getvars{
my $inifile = shift;
# hash mit Variablen binden
my %vars;
tie %vars, 'Config::IniFiles', ( -file => $inifile );
return %vars;
}
###########################################################################
__END__
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!!!
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
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