Platzhalter

 
Platzhalter PlatzhalterPlatzhalter

Dynamische Seiten statisch machen

Platzhalter
 
  Startseite
  eBook-Projekt
  Web-Lexikon
  Bücher bestellen
   
  Design-Theorie
  Design-Praxis
  Promotion
  HTML/XML-Praxis
  Projekt-Management
  Webmaster-Praxis
  Fragen & Antworten
  Technik-Ecke
   
  Portal/Links
  Buch-Rezensionen
  Software
  Impressum
PlatzhalterPlatzhalter







 

Platzhalter
Das Problem kennt jeder, der viel mit Scripts arbeitet, besonders, wenn er damit seine Inhalte verwaltet: wie kriege ich meine Inhalte in die Suchmaschinen?

Gründe

Die Gründe, wieso Suchmaschinen dynamisch erstelle Seiten nicht aufnehmen, liegen auf der Hand: bei dynamischen Seiten kann man davon ausgehen, dass sie sich sehr schnell wieder ändern - die Genauigkeit des Spiders wäre in Gefahr.

Mustererkennung

Woran erkennt ein Spider eine dynamische Seite? Entweder durch die Dateiendung (z.B. .pl, .asp., .jsp) oder durch im Dateinamen vorkommende Zeichen wie ?, %, & oder =.

Apache

Der Apache bietet hier eine recht simple Lösung. Mit Hilfe des Moduls mod_rewrite lassen sich hier Probleme mit Suchmaschinen umschiffen. Eine detaillierte Erklärung ginge hier zu weit, deswegen sei hier auf die entsprechende Dokumentation verwiesen.

Perl

Es gibt nichts, was man mit Perl nicht machen kann, so lautet eine der Weisheiten der Perl-Gemeinde. Zumindest in unserem Fall trifft sie zu, denn ein Perl-Script kann dynamische Seiten ohne Probleme in eine statischere Form bringen.

Hier gibt es zwei Lösungsansätze:

  • eine Art "Offline-Browser", der alle Links rekursiv verarbeitet und dann neu in ein Verzeichnis schreibt
  • ein direktes Front-End zum Redaktionssystem


Voraussetzungen

Wir gehen hier auf den zweiten Ansatz ein, denn der ist wesentlich einfacher zu verwirklichen. Voraussetzung: Ihr Redaktionssystem unterstützt frei definierbare Templates. Weiterhin brauchen wir ein Datenfeld in Ihrem Redaktionssystem, das für jeden Datensatz einzigartig ist, also eine Art Primärschlüssel.

Ihr Server muss Perl unterstützen (möglichst die aktuellste Version), das LWP::Simple-Modul muss verfügbar sein (oder eine get vergleichbare Funktion).

Weiterhin funktioniert dieser Ansatz nur dann wirklich gut, wenn es um einzelne Artikel geht, die alle von mindestens einer Übersichtsseite gelinkt werden.

Vorarbeit

Zur Daten-Ausgabe an unser Perl-Programm nutzen wir die normalen Ausgabefunktionen, die das Redaktionssystem bietet. Vorher müssen wir jedoch noch ein geeignetes Template definieren. Oft funktioniert es gut, das Template, das Sie zum Ausgeben eines normalen Artikels verwenden, zu modifizieren.

Nehmen wir an, Sie haben drei Datenfelder in Ihrer Datenbank: Titel, Untertitel und Text. Titel und Untertitel sollen auf Ihren Übersichtsseiten erscheinen, Titel und Text bei den Artikel-Texten.

Ihr normales Template für einen Test sah vorher so aus. Bitte beachten Sie, dass dieses Template schon sämtl. Layout-Code enthalten sollte, wir haben den Code für unser Beispiel nur vereinfacht.


<html>
<body>
<b>Platzhalter_für_Headline</b><br><br>
Platzhalter_für_Text
</body>
</html>


Das modifizieren wir so, dass es zusätzlich noch den Untertitel und eine "Hier ist Ende"-Markierung enthält:


<html>
<body>
<b>Platzhalter_für_Headline</b><br><br>
Platzhalter_für_Text
<!--Headline:::Platzhalter_für_Headline-->
<!--Untertitel:::Platzhalter_für_Untertitel-->
<!--Primary:::Platzhalter_für_Primärschlüssel-->
</body>
</html>
<!--HIER_IST_ENDE-->


Was können wir damit jetzt anfangen? Wenn Sie jetzt Ihr Redaktionssystem anweisen, alle Artikel mit unserem modifizierten Template auszugeben, haben Sie alle Daten Ihrer Datenbank auf einmal.

Das Script

Zunächst einmal müssen Sie jetzt Ihr Redaktionssystem anweisen, alle Daten mit unserem Template auszugeben. In Perl klappt das, wenn auf Ihrem Server das LWP-Modul installiert haben, so:


use LWP::Simple;
my $scriptausgabe = get("http://www.xyz.de/cgi-bin/redaktion.pl?Modus=GETALL&Template=template_modifiziert");


Natürlich muss hier die zweite Zeile Ihrem System entsprechend angepasst werden.

Jetzt separieren wir unsere Datensätze:


my @datens = split(/<!--HIER_IST_ENDE-->/,$scriptausgabe);


Was machen wir jetzt mit unseren getrennten Datensätzen? Wir schreiben eine Übersichtsseite und speichern die Einzeldateien.


$overview_code = "";
for (@datens)
{    
    my $code = $_;

    # Datenfelder extrahieren
    $code =~ //;
    my $primarykey = $1;

    # Code für die Übersichtsseite

    $overview_code .= qq(<a href="/content/$primarykey.html">$headline</a>\n<br>$untertitel<br><br>\n\n)

    # Sub zur Verarbeitung aufrufen

    &WorkWith($headline, $untertitel, $primarykey, $code);
}
&WriteToFile($overview_code, "overview.html");

Was wurde hier genau gemacht? Mit Hilfe von regulären Ausdrücken haben wir unsere in HTML-Kommentaren gespeicherten Informationen ausgelesen. Dann haben wir dem Code für unsere Übersichtsseite ein neues Stück hinzugefügt, nämlich einen Link.

Der Link gehört hier zu den entscheidenden Stellen im Code: wir linken hier auf einen Dateinamen, der dem Primärschlüssel entspricht. Wir wissen: dieser Primärschlüssel ist einzigartig. Und um die Datei dann auch zu erzeugen, wird &WorkWith aufgerufen.


sub WorkWith
{
    my $headline = $_[0];
    my $untertitel = $_[1];
    my $primkey = $_[2];
    my $code = $_[3];

    &WriteToFile($code, "html/$primkey.html");
}


Um den Code zu verstehen, muss man auch &WriteToFile verstehen. Diese Funktion dient dazu, etwas in eine Datei zu schreiben. Was geschrieben werden soll, ist das erste übergebene Argument, der relativen (!) Pfad ist das zweite Argument. In der Funktion selbst wird dann noch ein absoluter Pfad definiert.


sub WriteToFile
{
    $ToWri = $_[0];
    $FileToWrite_Rel = $_[1]; # Relativer Pfad...
    $FileToWrite = "/home/htdocs/content/".$FileToWrite_Rel;
    open(WRITEFILE, ">$FileToWrite") || &Ende("<b>WriteToFile</b> $FileToWrite nicht gefunden bzw. kann nicht zum Schreiben geöffnet werden!\n");
         print WRITEFILE $ToWri;
    close(WRITEFILE) || &Ende("Datei $FileToWrite konnte nicht ordnungsgemäß geschlossen werden!");
}


Der absolute Pfad in der 4. Zeile des Code-Ausschnitts muss natürlich noch angepasst werden.

Vergegenwärtigen wir uns noch einmal, was wir gemacht haben:

  1. Wir haben ein Template erstellt, das unser normales Layout für Artikel enthält. Gleichzeitig haben wir noch zusätzliche Daten, so z.B. den Primärschlüssel, in diesem Template als HTML-Kommentar untergebracht. Das heißt also, dass wir dieses Template weiterhin zur Ausgabe eines Artikels verwenden können (die zusätzlichen Daten stehen ja nicht sichtbar in einem Kommentar), gleichzeitig aber als Schnittstelle zu unserem Programm verwenden können.
  2. Wir haben alle Daten von unserem Redaktionssystem eingelesen, beim Auslesen unser Template angegeben und dann hinteher alle Datensätze in einem Array gespeichert.
  3. Wir gehen alle Datensätze nacheinander durch. Dabei passiert das folgende mit jedem Datensatz:

    • Die zusätzlichen Felder werden ausgelesen
    • Wir fügen ein Stück Code zu unserer Übersichtsseiten-Variable hinzu. Entscheidend ist hier das Link-Ziel: wir verwenden den Primärschlüssel als Dateinamen. Natürlich existiert diese Datei zu dem Zeitpunkt noch nicht, wird aber gleich noch geschrieben. Hier muss natürlich darauf geachtet werden, dass der hier angesprochene Pfad (/content) mit dem in &WriteToFile übereinstimmt.
    • Wir rufen &WorkWith auf. Diese Prozedur schreibt eine Datei (Dateiname: Primärschlüssel + ".html") in das /content/html-Verzeichnis, wohin eben noch gelinkt wurde.

  4. Nach Verarbeitung aller Datensätze schließlich schreiben wir noch die Übersichtsseite. Die landet im /content-Verzeichnis.



Autor: Alexander Dilthey | Erstmalig veröffentlicht: 28.10.2000 | Einen Artikel schreiben?

 

Neue Artikel

Rezension: Entwurfsmuster von Kopf bis Fuß
Rezension: Webdesign mit CSS
AJAX - XML und JavaScript in Schönheit vereint?
Rich Email - Flash im Newsletter
Screen Reader Usability
Comment Spam und CAPTCHAs
Logfile-Analyse selbst gemacht - ein Perl-Beispiel

Partnerprogramm




Kommentar

Ist die Freiheit der Informationsgesellschaft in Gefahr?
Derzeit leben wir in einer relativ freien Welt. Doch sind derzeit Tendenzen erkennbar, die Freiheit des Individuums den Interessen der Großindustrie zu opfern. Ein Kommentar.

Druckversion
Sie wollen diese Seite ausdrucken? Dafür haben wir eine spezielle Druckversion ohne grafische Elemente entwickelt!



Einführung in CSS bei HTMLWorld.