Suchmaschinenfreundlichkeit mit mod_rewrite

malsdgtac
Beiträge: 717
Registriert: Fr 12. Mär 2004, 15:50
Kontaktdaten:

Suchmaschinenfreundlichkeit mit mod_rewrite

Beitrag von malsdgtac » Fr 12. Mär 2004, 15:52

Das Thema Suchmaschinenfreundlichkeit ist ja ein heiß diskutiertes Thema hier und ich habe jetzt eines welche es zumindest für mich tut.

Ich löse es mit dem mod_rewrite Module von Apache, welches es schafft URL umzuwandeln.

Somit wird eine Seite welche folgend aufgerufen wird:
/1_1_48_.html in
/front_content.php?client=1&lang=1&idcat=48&idart= umgewandelt.
In diesem Fall ist die idart leer.

Dazu mus man eine .htaccess - Datei mit folgenden Inhalt erstellen und in den Ordner cms legen:

RewriteEngine On
RewriteRule ^(.*)_(.*)_(.*)_(.*).html$ /smac-at/cms/front_content?client=$1&lang=$2&idcat=$3&idart=$4

Der "_" stellt das Trennzeichen dar und die einzelnen Teile zu trenne.


Man muß auch alle zu erstellenden Links so erstellen, dass immer die gleiche Reihenfolge eingehalten wird. Hier zwei Beispiele:

Hauptnavigation:
$tpl->set('d', 'HREF', $sess->url('front_content.php?idcat='.$data['idcat']));
ersetzen mit:
$tpl->set('d', 'HREF', $sess->url($client.'_'.$lang.'_'.$data['idcat'].'_.html'));

in diesem Fall bekommt man die leere Idart (diese hatte mir lange Probs bereitet).

Bei dem Modul "Artikelblaettern" von Argon habe ich folgendes geändert:
$navmod_link ="front_content.php?client=$client&lang=$lang&idcat=".$artikel[$i][1]."&idart=".$artikel[$i][0]."";
ersetzen mit:
$navmod_link =$client."_".$lang."_".$artikel[$i][1]."_".$artikel[$i][0].".html";

hier wird auch die idart erstellt.


Ich bin zwar selbst überrascht, aber das ganze funktioniert bei mir bist jetzt ohne Probleme.

laurisilva
Beiträge: 40
Registriert: Di 11. Nov 2003, 19:16
Kontaktdaten:

Beitrag von laurisilva » Do 1. Apr 2004, 00:38

Hallo,
vielen Dank für diese vernünftige Lösung. Ich habe allerdings mehrere rules erstellt, um nicht so komische Links wie 1_1_48_.html zu bekommen. Die meisten Links (Links der Hauptnavigation, der Sitemap und der Servicenavigation) lauten jetzt wie http://www.coaching-informationen.de/270.html. Das ist kurz und knapp und für den user leicht zu merken. Links die sich auf Unterartikel einer Kategorie beziehen und mindestens zwei Parameter verwenden, wie z.B. im Newsmodul oder im Artikelblätternmodul verwendet lauten jetzt z.b. http://www.coaching-informationen.de/270,529.html. Da hat Google seine Freude! Für die links a la ehemals front_content.php?idcatart=57 habe ich ebenfalls eine eigene rule erstellt und an diese vor die Zahl eine Zeichenkette angehängt, damit diese rule nicht mit der ersten erwähnten in Konflikt gerät. Beispiel: http://www.coaching-informationen.de/coaching370.html

Der Inhalt der .htaccess:

Code: Alles auswählen

RewriteEngine On 
RewriteRule ^(.*),(.*).html$ /front_content.php?idcat=$1&idart=$2
RewriteRule ^coaching(.*).html$ /front_content.php?idcatart=$1
RewriteRule ^(.*).html$ /front_content.php?idcat=$1
Die für die Links verantwortliche Zeile der Hauptnavigation:

Code: Alles auswählen

  $tpl->set('d', 'HREF', $sess->url($data['idcat'].'.html')); 
..der Hilfsnavigation

Code: Alles auswählen

<a class="weiss" href="'.$db->f("idcat").'.html">'.$db->f("name").'</a></td>';
...des Newsmoduls von Darth Vader:

Code: Alles auswählen

 // print articles
    for ($i=$anzahl*$blatt; $i < min($j,$anzahl*$blatt+$anzahl); $i++) {
      $k = $i-1;
      $navmod_link ="".$artikel[$i][1].",".$artikel[$i][0].".html";
      echo "
      <tr>";
..des Moduls Newsartikelblättern von Darth Vader:

Code: Alles auswählen

 if($next != " ") {echo "<a href=\"".$next."\">&laquo;&nbsp;n&auml;chster, nach diesem geschriebener Artikel</a>";}
  else {echo $next;}
  echo "</td><td align=\"center\">Artikel ".($key+1)." von ".$rows."</td>
    <td align=\"right\" width=\"33%\" >";
  if ($prev != " ") {echo "<a href=\"".$prev."\">n&auml;chster, vor diesem geschriebener Artikel&raquo;</a>";}
  else {echo $prev;}
  echo "</td>
   </tr>
   <tr valign=\"bottom\">
    <td colspan=\"3\" align=\"center\" height=\"30\">
      <a href=\"".$idcat.".html\">&laquo;&nbsp;Zur&uuml;ck zur&nbsp;&Uuml;bersicht&nbsp;&raquo;</a>
    </td>
   </tr>
  </table>
  <!-- end Artikelblättern -->
Ein großes Problem habe ich allerdings noch:
kann man die mit dem Spaw manuell erstellten Links im Text nachträglich auf die HTML-Form a la coaching57.html bringen. Geht das eventuell ähnlich wie

Code: Alles auswählen

$code = str_replace("serverold.com", "servernew.com", $code);
Wenn ja nach welchem Schema würde das funktionieren?
Was muss ich ändern, damit die neu erzeugten Links in Zukunft automatisch die HTML-Form haben?


Wenn mir da jemand helfen könnte wäre ich sehr dankbar!

Viele Grüsse
Anian
-------------------------------------------------------
www.anian-leistner-webdesign.de

malsdgtac
Beiträge: 717
Registriert: Fr 12. Mär 2004, 15:50
Kontaktdaten:

Beitrag von malsdgtac » Do 1. Apr 2004, 07:32

Schön dass doch jemand meint, mein Ansatz in die richtige Richtung geht. Die Idee mit mehreren Rules findet ich auch gut - wenn auch etwas unübersichtlicher, okay 24_1_1_1.html ist auch nicht gerade überischtlicher - aber doch immer das gleiche Schema.

Das mit dem Problem mit Spaw verstehe ich allerdings nicht ganz, es geht dabei um die Links die man auswählen und einfügen kann? Da bin ich auch (leider) noch nicht weiter. Ich denke mal im Spaw werden auch irgendo (wo denn nur) die Links erstellt und gleich dort sollte man dies ändern. Dann allerdings ist es denke ich schwieriger mit 3 Rules als mit einer zu arbeitern, denn wie soll Spaw unterscheiden welche angewendet werden soll?

Ich denke auch dass solche Links Google ganz gerne haben müßte - ist da jemand anderer Meinung? Wie siehts damit eigentlich aus wenn ich statt 24_1_1_1.html z.B. 24_1_1_1.irgendwas nehme? Mag das Google auch so gerne? Funktionieren tut es ja einwandfrei.

Vielen Dank für eure Meinungen

laurisilva
Beiträge: 40
Registriert: Di 11. Nov 2003, 19:16
Kontaktdaten:

Beitrag von laurisilva » Do 1. Apr 2004, 10:31

Hi,
der Spaw zieht sich die Links als Variable irgendwo aus Contenido. Übrigens immer den selben Typ idcatart - deshalb gibts auch bei mehreren rules kein Problem.
Mir ging es hauptsächlich erst mal darum, die alten Links eventuell über einen Befehl in der front_content umzuschreiben. Vielleicht hat ja da jemand einen Tipp.
Google kann sich natürlich auch die länderen Links merken. Allerdings habe ich mal gehört, das Google die underscores in Links ignoriert und dann aus 24_1_1_1.html 24111.html macht. Ob das Stimmt weiß ich nicht genau. Google indiziert nur Links von bestimmten Datiendungen. Welche kann man in den einschägigen Foren erfahren.
-------------------------------------------------------
www.anian-leistner-webdesign.de

spengel
Beiträge: 25
Registriert: Do 29. Apr 2004, 12:52
Kontaktdaten:

Beitrag von spengel » Do 29. Apr 2004, 21:33

könnte mir evtl. jemand den result-Aufruf für die Sitemap und Suche passend zum erstgenannten Beispiel umwandeln ? Ich bekomme leider nur wirre Ausgaben wenn ich darin rumpfusche.

Sitemap:

Code: Alles auswählen

 $result.=  "<tr><td width='140px' bgcolor='".$color[$colorID].
                  "' valign=top><a href='front_content.php?idcat=".$db->f("idcat").
                  "&lang=$lang&client=$client' class='lmLink'>".
                  $db->f("name")."</a></td><td>".sitemap($db->f("idcat")).
                  "</td></tr>";
Suche:

Code: Alles auswählen

$results[$num][link] = "front_content.php?client=".$client."&la"."ng=".$lang."&idcat=".$db->f("idcat")."&idart=".$db->f("idart").""; 
Danke

malsdgtac
Beiträge: 717
Registriert: Fr 12. Mär 2004, 15:50
Kontaktdaten:

Beitrag von malsdgtac » Fr 30. Apr 2004, 07:51

Hallo Spengel,

versuche es doch mal mit folgenden:

Code: Alles auswählen

$result.=  "<tr><td width='140px' bgcolor='".$color[$colorID]. 
                  "' valign=top><a href='".$db->f("idcat"). 
                  "_".$lang."_".$client."' class='lmLink'>". 
                  $db->f("name")."</a></td><td>".sitemap($db->f("idcat")). 
                  "</td></tr>";
bzw.

Code: Alles auswählen

$results[$num][link] = $client."_".$lang."_".$db->f("idcat")."_".$db->f("idart").""; 
Leider bin ich jemand der immer alles ausprobieren muß um alle Anfrührungszeichen usw. richtig zu setzen, aber ich denke besonders das zweite sollte so passen.

spengel
Beiträge: 25
Registriert: Do 29. Apr 2004, 12:52
Kontaktdaten:

Beitrag von spengel » Fr 30. Apr 2004, 08:52

Perfekt, herzlichen Dank. Mit den Anführungszeichen hatte ich ebenso meine Probleme beim umwanden, ich kam dem zwar näher aber irgendwo paßte trotzdem immer etwas nicht ;)

Ich habe die beiden gerade noch soweit umgestellt das bei der Sitemap die Sortierung (z.B. 1_1_20_.html) so ist wie auf der übrigen Seite und das .html eingefügt.

Sitemap:

Code: Alles auswählen

$result.=  "<tr><td width='140px' bgcolor='".$color[$colorID]. 
                  "' valign=top><a href='".$client."_".$lang."_".$db->f("idcat")."_.".html."' class='lmLink'>".
                  $db->f("name")."</a></td><td>".sitemap($db->f("idcat")). 
                  "</td></tr>";
Suchausgabe:

Code: Alles auswählen

$results[$num][link] = $client."_".$lang."_".$db->f("idcat")."_".$db->f("idart").".html";

anjin san
Beiträge: 31
Registriert: Do 20. Mai 2004, 03:21
Kontaktdaten:

Beitrag von anjin san » Mi 9. Jun 2004, 01:28

Hallo Leute,

Habe mit mod_rewrite mal herumprobiert.
Habe den Code von laurisilva genommen, aber leider geht gar nix.
Im quellcode der an den Browser ausgelieferten front_content.php steht zwar richtiger weise ...href="2.html"
aber beim Aufruf erscheint Fehler404 Seite nicht gefunden.
Sorry :twisted: hat sich erledigt, nachdem ich in der .htaccess ein wenig an den Pfaden herumgespielt habe.
Da bei mir das Ganze im Ordner cms liegt musste ich diesen Pfad auch in der htaccess angeben.
Danke für diese Lösung.

FrankHoffmann
Beiträge: 149
Registriert: Sa 21. Jun 2003, 14:03
Kontaktdaten:

Beitrag von FrankHoffmann » Do 10. Jun 2004, 11:36

@smac
Somit wird eine Seite welche folgend aufgerufen wird:
/1_1_48_.html in
/front_content.php?client=1&lang=1&idcat=48&idart= umgewandelt.
In diesem Fall ist die idart leer.
Der technische Ansatz ist vermutlich okay. Aber für Google ist es egal ob die URL so oder lautet. Es ist ein Irrtum, das Google Seiten mit einer URL wie etwa http://www.domain.de/front_content.php? ... 1&idcat=48 nicht oder nur schlecht indiziert. Allerdings hat die URL Einfluss auf das Ranking. Perfekt wäre eine Lösung, die die Keywords als HTML Dateinamen schreibt. Eine Seite über Bleistifte wird bei Google eher vorne auftauchen, wenn sie beistift.html heisst als wenn sie 1_1_48.html heisst.

Suche mal bei Google nach front_content
ccccccccc

malsdgtac
Beiträge: 717
Registriert: Fr 12. Mär 2004, 15:50
Kontaktdaten:

Beitrag von malsdgtac » Do 10. Jun 2004, 12:02

@FrankHoffmann
vielen Dank für die Info, ich habe es auch gleich ausprobiert und nach front_content gesucht - viele & und viele ? in den URL, damit hat google wohl keine Probleme mehr.

Die Idee mit den keywords ist auf jeden Fall besser, doch gibt es unter contenido Möglichkeiten diesen in die url einzubauen?

FrankHoffmann
Beiträge: 149
Registriert: Sa 21. Jun 2003, 14:03
Kontaktdaten:

Beitrag von FrankHoffmann » Do 10. Jun 2004, 12:10

ich habe ein Script geschrieben, mit dem die Startartikel aller Kategorien mit dem Kategorienamen geschreiben werden. Dieses Script wird als cronjob aufgerufen.

Siehe http://www.x28.de

malsdgtac
Beiträge: 717
Registriert: Fr 12. Mär 2004, 15:50
Kontaktdaten:

Beitrag von malsdgtac » Mi 16. Jun 2004, 13:37

Ich habe mir das auf dieser Seite angeschaut - ist das das Script um 10 euro?
Kann man das auch ohne cronjobs machen?
werden dann nur die Links auf der Startseite generiert oder kann man das auch für die unternavigationen machen?

FrankHoffmann
Beiträge: 149
Registriert: Sa 21. Jun 2003, 14:03
Kontaktdaten:

Beitrag von FrankHoffmann » Mi 16. Jun 2004, 13:56

das Script wird Kunden x28.de von x28.de auf Wunsch kostenlos eingerichtet. Es kann auch ohne cronjob gestartet werden und macht aus allen Startartikeln aller Kategorien statische Seiten. Die Seiten erhalten den Namen der Kategorie. Aus dem Startartikel der Kategorie "Meine Wünsche" wird meine_wuensche.php
Die Links auf diese Seiten werden automatisch mit angepasst.

nikolis
Beiträge: 1
Registriert: Di 15. Jun 2004, 09:10
Kontaktdaten:

Beitrag von nikolis » Do 17. Jun 2004, 15:22

schöner thread, hat mir den Anfang sehr erleichtert.

@laurisilva: Ich hatte das gleich Problem, bei mir sind das allerdings sehr wenige links und da ist es einfacher diese manuell zu aktualisieren. Das einzige was ich aber gemacht habe, ist den enstprechenden part in htmlarea zu aktualisieren so dass alle neuen Links so eingefügt werden wie es gewollt ist. In der Datei dialogs/insert_link.php kannst du das an einer Stelle ändern damit der "Interne Link" in Zukunft richtig gesetzt wird.

Um es im nachhinein zu machen müsstest du glaub ich die db per script aktualisieren und ich denke mal in der Datenbank-Tabelle namens content die entsprechenden Werte des Feldes namens "value" editieren. Ich bin aber noch nicht so contenido erfahren, und weiss nicht ob es noch andere Fälle gibt wo das wo anderes gespeichert wird.

Ich persönlich finde FrankHoffmann's Lösung am besten obwohl ich das "Skript" nirgendwo gefunden habe zum Download, und Kunde will ich bei ihm nicht werden. Ich weiss nicht ob du es der Communitiy hier angeboten hast, oder es nicht anbieten möchtest. Wie auch immer, es ist ja auch nichts dabei das selber zu machen. Und aus SEO Sicht ist es auf jeden Fall die bessere Lösung, den Dateinamen nach dem Kategorienamen zu benennen. Da das Skript aber statische Seiten erzeugt, finde ich es als nicht so optimale Lösung. Ich habe mich für eine Kombination entschieden zwischen laurisilva's Ansatz und FrankHoffmann's:

Ich habe laurisilvas Ansatz umgesetzt und einfach etwas erweitert. Meine Zeile(n) in der .htaccess lautet:

RewriteRule ^([0-9]*)-(.*).html$ /front_content.php?idcat=$1

Somit habe ich das Format :

26-Buchhandlung.html

was man sicher noch optimieren kann. Dabei ist 26 die id, das minus nur ein Trennzeichen, und Buchhandlung der zur ID 26 gehörende Kategorie-Name, der aber ignoriert wird, das erkennt man daran das ich kein $2 verwende.

An den von laurisilva erwähnten Stellen für die Navigationslinks habe ich einfach "sein":
$data['idcat'].
ersetzt/erweitert durch:
$data['idcat'].'-'.$data['name'].

Ich weiss natürlich nicht ob es da Fälle gibt wo das nicht so richtig klappt, aber soweit ich das bisher sehe, sollten die auch lösbar sein.
Der Vorteil ist dass man das weiterhin im contenido style hat und keine statischen Seiten erzeugen brauch, ein Nachteil ist das die ID (mit dem Bindestrich) dazwischen ist.

FrankHoffmann
Beiträge: 149
Registriert: Sa 21. Jun 2003, 14:03
Kontaktdaten:

Beitrag von FrankHoffmann » Do 17. Jun 2004, 15:38

Hallo nikolis,

eines sollte auf jeden Fall noch in die Überlegungen einfliessen: Beim rewrite ist die Serverlast ungleich höher als bei meinem Ansatz. Immerhin wird erst aus der Datenbank gelesen, dann geschrieben (Statistik) und dann ausgegeben. Macht man einfach statische Seiten daraus, dann entfällt das Lesen aus der Datenbank komplett. Übrigens sind die Seiten auch bein meinem Ansatz nicht ganz statisch, denn die Statistik wird sehr wohl fortgeschrieben.

Ich habe mich nun entschieden das Skript zu veröffentlichen. Es wird demnächst auf www.x28.de im Contenido-Kochbuch erscheinen.
ccccccccc

Gesperrt