Alexander Foken: Broken Image

Beitrag lesen

Moin Moin !

Mit einem Script für die 404-Meldung; vorausgesetzt, Du kannst den geforderten Bildtyp anhand der URL erkennen.

Folgendes Script ist meine 404-Meldung auf meinem Intranet-Server (beide schon etwas angestaubt):

---8<---8<---8<---
#!/usr/bin/perl -w
use strict;
use CGI qw(:all);
use Socket;

sub status
{
 my $stat=shift;
 my $stat2=$stat;
 $stat2=~s/^\d+\s+//;
 return +(
  header(-status=>$stat),"\n",
  start_html($stat2),"\n",
  h1($stat2),"\n"
 );
}

sub sign
{
 if (defined $ENV{'SERVER_SIGNATURE'}) {
  return +(
   hr(),"\n",
   $ENV{'SERVER_SIGNATURE'},"\n",
   end_html(),"\n"
  );
 } else {
  return +(end_html(),"\n");
 }
}

unless (defined $ENV{'REDIRECT_URL'}) {
 # we were not called by Apache's ErrorDocument directive
 print
  status('403 Forbidden'),
  p('This script is for internal purposes only.'),
  sign();
 exit(0);
}

my $url=$ENV{'REDIRECT_URL'};

if ($url=~/.js$/i) {
 # Missing Javascript

my $msg=qq[
404 Not Found

$url
is missing.

This is a server-generated replacement that only shows you this message.
Expect trouble with your webpage ...
 ];
 $msg=~s/\n/\n/gs;
 $msg=~s/^\s+//gm;
 print
  header(
   -expires=>'-1d',
   -type=>'text/javascript',
  ),
  qq[
/* 404 Not Found */
/* The real javascript file "$url" is missing. */
window.alert('$msg');
  ];
 exit(0);
}

if ($url=~/.css$/i) {
 # Missing Javascript

print
  header(
   -expires=>'-1d',
   -type=>'text/css',
  ),
  "/* 404 Not Found */\n",
  "/* The real stylesheet file "$url" is missing. */\n";
 exit(0);
}

if (($url=~/.gif$/i) or ($url=~/.jpe?g?$/i) or ($url=~/.png$/i)) {
 # Missing Image
 print
  header(
   -expires=>'-1d',
   -type=>'image/gif',
  ),
  "\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\x00\x00\x00\x00\x00" .
  "\xFF\xFF\xFF\x21\xF9\x04\x01\x00\x00\x00\x00\x2C\x00\x00\x00\x00" .
  "\x01\x00\x01\x00\x00\x02\x01\x44\x00\x3B";
  # Data is a 2-color 1x1 Pixel transparent GIF image
 exit(0);
}

standard broken link

print
 status('404 Not Found'),
 p("The requested URL $url was not found on this server."),
 sign();

exit(0);
---8<---8<---8<---

Es geht sicher auch anders, vielleicht mit Rewrite-Rules. Mein Script funktioniert auf meinem Linux jedenfalls.

Auf Windows sollte noch möglichst früh "binmode STDOUT;" eingefügt werden, weil sonst das Ersatz-Gif beschädigt werden könnte. Unter Linux ist das unnötig, schadet aber auch nicht.

Alexander

--
Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"