404 Script sendet nicht den richtigen Link (schwer)
Torwächter
- perl
Hallo zusammen,
ich habe ein Perl Script erstellt, welches aufgerufen wird, wenn eine Seite nicht gefunden wurde. Alles schön und gut, das Script läuft und sendet auch brav seine eMail, DOCH der Link, von welchem das Script aufgerufen wird , wird nicht angezeigt (Ich nehme an, das liegt an .htaccess) aber wie bekomm ich es hin, dass dieses Script die fehlerhafte Seite anzeigt, oder den Link, oder was sonst auch immer mir sagt welche Seite nicht gefunden wurde.
Vielen Dank schon mal für die Mühe
mFg
Torwächter
---- xxx ist absichtlich gelöscht ----
#!/bin/perl
#Version 1.0
#Stand 14.11.2001
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<([^>]|\n)*>//g;
$value =~ s/<//g;
$value =~ s/>//g;
$FORM{$name} = $value;
}
###############################
$von = $ENV{'HTTP_REFERER'};
$log = "/htdocs/www/logs/fehlerloger.log";
########################MAIL#######################
my $Sendmail_Prog = "/bin/sendmail";
my $supp = "xxx";
my $mailto = "xxx";
my $subject = "Seite wurde nicht gefunden";
open(MAIL,"|$Sendmail_Prog -t") || print "Mailprogramm konnte nicht gestartet werden\n";
print MAIL "From: $supp\n";
print MAIL "To: $mailto\n";
print MAIL "Subject: $subject\n\n";
print MAIL "Der Link von $von sollte geprüft werden.\n\n";
if($FORM{'beschreibung'} ne "")
{
print MAIL "Der Sender war so freundlich dies zu schreiben\n\n";
print MAIL "$FORM{'beschreibung'}\n";
}
close(MAIL) || print "Fehler beim Mailversenden!";
#####################################################
open(DATEI, ">>$log");
print DATEI "$vonII\n";
close(DATEI);
#####################################################
isperl:
print "Content-type: text/html\n\n";
print qq~
<html>
<head>
<title></title>
</head>
<body text="#000000" bgcolor="#000080" background="http://www.manga-zone.com/pics/bg.gif" link="#FF0000" alink="#FF0000" vlink="#FF0000">
<center>
<table width="100%" height="100%" border="0" cellspacing="0">
<tr>
<td height="25" bgcolor="#000000"> 1</td>
<td height="25" bgcolor="#000000"> 2</td>
<td height="25" bgcolor="#000000"> 3</td>
</tr>
<tr>
<td width="25" bgcolor="#000000"> 4</td>
<td bgcolor="#FFCCCC">
<!--ANFANG DER TABELLE-->
<font size="6"><b>404</b></font>
<br>
<br>
<b>
Leider wird die von Ihnen angeforderte Seite nicht gefunden, bitte versuchen Sie es zu einem späteren Zeitpunkt nocheinmal. Vielen Dank.
</b>
<br>
<br>
<b>
The site you want, couldn´t be find, please try again later. Thanks.
</b>
<br>
<br>
~;
if($FORM{'beschreibung'} eq "")
{
print qq~
Sie können uns helfen, den Fehler schneller zu finden, wenn Sie in das Feld schreiben, was Sie gemacht haben (z.B. Bild ausgewählt), bevor der Fehler gekommen ist. Vielen Dank<br>
You also can help us to find the error faster, if you write into the fild, what you have done. Thanks<br><br>
<form action="xxx/cgi-bin/404/notfound.pl" method="post">
<input type="Text" name="beschreibung" value="" size="50"><input type="Submit" value="POST">
</form>
~;
}
else
{
print "Vielen Dank für Ihre Mühe, die Daten wurden uns gesendet<br>Thanks, we´ve got the eMail";
}
print qq~
<br>
<!--ENDE DER TABELLE-->
</td>
<td width="25" bgcolor="#000000"> 6</td>
</tr>
<tr>
<td height="25" bgcolor="#000000"> 7</td>
<td height="25" bgcolor="#000000"> 8</td>
<td height="25" bgcolor="#000000"> 9</td>
</tr>
</table>
</center>
</body>
</html>
~;
exit;
Hallo Torwächter !
Aus der Hüfte geschossen würde ich den Übeltäter hier vermuten:
$von = $ENV{'HTTP_REFERER'};
HTTP_REFERER wird nicht von allen Browsern übergeben, in einigen
kann man das sogar gewollt unterdrücken, und bei mir
erledigt das z.B. der Webwasher.
Siehe auch:
http://selfhtml.teamone.de/cgiperl/intro/umgebungsvariablen.htm
MfG McNavc
Hallo zusammen,
ich habe ein Perl Script erstellt, welches aufgerufen wird, wenn eine
Seite nicht gefunden wurde. Alles schön und gut, das Script läuft und
sendet auch brav seine eMail, DOCH der Link, von welchem das Script a
ufgerufen wird , wird nicht angezeigt (Ich nehme an, das liegt an .htaccess) aber wie bekomm ich es hin, dass dieses Script die fehlerhafte Seite anzeigt, oder den Link, oder was sonst auch immer mir sagt welche Seite nicht gefunden wurde.
Vielen Dank schon mal für die Mühe
mFg
Torwächter
Versuch mal lieber REQUEST_URI, dass verweisst richtig.
Zu Dein Script: Nie nie nie eigene Routinen fuer CGI & co schreiben. Es gibt dafuer extra ein Paackage, das sicher ist.
Ciao Micha
---- xxx ist absichtlich gelöscht ----
#!/bin/perl
#Version 1.0
#Stand 14.11.2001
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<([^>]|\n)*>//g;
$value =~ s/<//g;
$value =~ s/>//g;
$FORM{$name} = $value;
}
###############################
$von = $ENV{'HTTP_REFERER'};
$log = "/htdocs/www/logs/fehlerloger.log";
########################MAIL#######################
my $Sendmail_Prog = "/bin/sendmail";
my $supp = "xxx";
my $mailto = "xxx";
my $subject = "Seite wurde nicht gefunden";
open(MAIL,"|$Sendmail_Prog -t") || print "Mailprogramm konnte nicht gestartet werden\n";
print MAIL "From: $supp\n";
print MAIL "To: $mailto\n";
print MAIL "Subject: $subject\n\n";
print MAIL "Der Link von $von sollte geprüft werden.\n\n";
if($FORM{'beschreibung'} ne "")
{
print MAIL "Der Sender war so freundlich dies zu schreiben\n\n";
print MAIL "$FORM{'beschreibung'}\n";
}
close(MAIL) || print "Fehler beim Mailversenden!";
#####################################################
open(DATEI, ">>$log");
print DATEI "$vonII\n";
close(DATEI);
#####################################################
isperl:
print "Content-type: text/html\n\n";
print qq~
<html>
<head>
<title></title>
</head>
<body text="#000000" bgcolor="#000080" background="http://www.manga-zone.com/pics/bg.gif" link="#FF0000" alink="#FF0000" vlink="#FF0000">
<center>
<table width="100%" height="100%" border="0" cellspacing="0">
<tr>
<td height="25" bgcolor="#000000"> 1</td>
<td height="25" bgcolor="#000000"> 2</td>
<td height="25" bgcolor="#000000"> 3</td>
</tr>
<tr>
<td width="25" bgcolor="#000000"> 4</td>
<td bgcolor="#FFCCCC">
<!--ANFANG DER TABELLE-->
<font size="6"><b>404</b></font>
<br>
<br>
<b>
Leider wird die von Ihnen angeforderte Seite nicht gefunden, bitte versuchen Sie es zu einem späteren Zeitpunkt nocheinmal. Vielen Dank.
</b>
<br>
<br>
<b>
The site you want, couldn´t be find, please try again later. Thanks.
</b>
<br>
<br>
~;
if($FORM{'beschreibung'} eq "")
{
print qq~
Sie können uns helfen, den Fehler schneller zu finden, wenn Sie in das Feld schreiben, was Sie gemacht haben (z.B. Bild ausgewählt), bevor der Fehler gekommen ist. Vielen Dank<br>
You also can help us to find the error faster, if you write into the fild, what you have done. Thanks<br><br>
<form action="xxx/cgi-bin/404/notfound.pl" method="post">
<input type="Text" name="beschreibung" value="" size="50"><input type="Submit" value="POST">
</form>
~;
}
else
{
print "Vielen Dank für Ihre Mühe, die Daten wurden uns gesendet<br>Thanks, we´ve got the eMail";
}
print qq~
<br>
<!--ENDE DER TABELLE-->
</td>
<td width="25" bgcolor="#000000"> 6</td>
</tr>
<tr>
<td height="25" bgcolor="#000000"> 7</td>
<td height="25" bgcolor="#000000"> 8</td>
<td height="25" bgcolor="#000000"> 9</td>
</tr>
</table>
</center>
</body>
</html>
~;
exit;
wie bekomm ich es hin, dass dieses Script die fehlerhafte Seite anzeigt,
oder den Link, oder was sonst auch immer mir sagt welche Seite nicht
gefunden wurde.
Hallo zusammen,
ich habe ein Perl Script erstellt, welches aufgerufen wird, wenn eine Seite nicht gefunden wurde. Alles schön und gut, das Script läuft und sendet auch brav seine eMail, DOCH der Link, von welchem das Script aufgerufen wird , wird nicht angezeigt (Ich nehme an, das liegt an .htaccess) aber wie bekomm ich es hin, dass dieses Script die fehlerhafte Seite anzeigt, oder den Link, oder was sonst auch immer mir sagt welche Seite nicht gefunden wurde.
Vielen Dank schon mal für die Mühe
mFg
Torwächter
Schreib einfach mal das gesamte %ENV-Hash raus, entweder zum Browser oder in die Mail. Dann kannst Du nachsehen, in welcher Variable dein Link steht.
Ansatz für Mail:
print MAIL "Environment Dump:\n";
foreach my $key (sort keys %ENV) {
print MAIL "$key => $ENV{$key}\n";
}
Ansatz für HTML (ohne CGI-Modul):
print "<H3>Environment Dump</H3>\n<P><PRE>\n";
foreach my $key (sort keys %ENV) {
print MAIL "$key => $ENV{$key}\n";
# ^-- hier sollte man eigentlich escapen ...
}
print "</PRE></P>\n";
Ansatz à la Perl - use the Modules, Dude:
use CGI qw(:all);
use Data::Dumper;
...
print
h3('Environment Dump'),
p(pre($CGI::Q->escapeHTML(Dumper(%ENV))));
print MAIL "Environment Dump:\n",Dumper(%ENV),"\n";
Du schreibst ein Formular raus. Zu diesem Zeitpunkt kennst Du die fehlerhafte URL. Dann läßt Du den User das Formular ausfüllen, schleppst die fehlerhafte URL aber nicht mit, so daß beim nächsten Aufruf des CGIs durch den Surfer (beim Auswerten des Formulars) diese Information verloren ist. Pack die URL als Hidden-Feld ins Formular.
Ich denke, daß Du ohne das Formular auskommen könntest, denn Du könntest einfach fehlerhafte URL und Referrer loggen, das reicht i.d.R. aus, um kaputte Links zu finden.
Wie schon geschrieben: Nimm das Standard-CGI-Modul, damit baust Du garantiert (naja, fast ;-)) keine unbeabsichtigten Hintertüren in den Script ein. Das Modul ist 1000fach im Einsatz und besser getestet als alles, was Du selbst schreiben kannst.
Dein Englisch ist -- sorry! -- grausam. Laß es sein oder frag jemanden, der sich damit auskennt.
Tux2000
hi Torwächter,
background="http://www.manga-zone.com/pics/bg.gif"
hm ... was wollen uns diese Worte sagen?
<form action="xxx/cgi-bin/404/notfound.pl" method="post">
Vermutlich, daß Du Dir das Einfügen von 'xxx' hättest sparen können. ;-)
Naja, dann also mal ein kleiner Besuch in Deinem Reich:
Fazit: Die Ausgabe von Diagnosemeldungen ist keine schlechte Idee -
wenn man sie zum richtigen Zeitpunkt vornimmt.
Dieser ist aber _nach_ dem HTTP-Header - nicht _vor_ ihm ...
Viele Grüße
Michael
Vielen Dank für die Mühe, die ihr euch macht, aber soweit ich das beurteilen kann, stützt sich all dies auf die .htaccess. Ich kann diese benutzten, um eine eigene Fehlerseite anzeigen zu lassen, doch kann ich sie nicht verändern (bis auf die Fehlerseite). Gibt es nicht eine Funktion, wie History-1 in Java auch für CGI/Perl, mit der man die letzte Seite anzeigen lassen kann.
Viele Grüße
Torwächter
Hi Torwächter,
Vielen Dank für die Mühe, die ihr euch macht,
Mein Posting sollte Dich konkret auf die Stelle
hinweisen, über die Du wahrscheinlich nicht sonderlich glücklich sein wirst.
Gibt es nicht eine Funktion, wie History-1 in Java auch für CGI/Perl, mit der man die letzte Seite anzeigen lassen kann.
Der Linke Setzer hat Dich auf die Apache-Dokumentation hingewiesen, in der beschrieben ist, welche zusätzlichen Environment-Variablen einem CGI-Skript während der Behandlung einer ErrorDocument-Operation zur Verfügung stehen. Dort solltest Du fündig werden.
Viele Grüße
Michael