Seite 1 von 1

artikel.php?id=14472 -> artikel/titel-des-eintrags-14472

Verfasst: 11.05.2010, 17:54
von ViperTK
Hab jetzt folgende RewriteRules erstellt.

Code: Alles auswählen

RewriteEngine on
RewriteRule ^([^/.]+)$ $1.php [L]
RewriteRule ^([^./]+)/([^/.]+)$ $1.php?site=$2 [L]
Damit kann ich jetzt beispielsweise
index.php?site=showdetails&id=1
in
/index/showdetails/1

Jedoch hätte ich jetzt dazu eine Frage, über die ich schon länger am senieren bin, jedoch immernoch nicht wirklich weiss wie dafür die RewriteRule aussieht bzw. wie man das ganze überhaupt handhabt.

Code: Alles auswählen

http://www.domain.de/artikel/14472/css-interview-mit-kai-kai-schafer-man-kann-nie-genug-fur-die-eps-vorbereitet-sein_css/
Wie bekomme ich eine solche RewriteRule hin?
Bzw. weiss ich ja, dass die dort zu sehende URL einfach nur unsichtbar für uns User weitergeleitet wird an beispielsweise an

Code: Alles auswählen

http://www.domain.de/artikel.php?id=14472
Was ich mir allerdings noch nicht erklären kann, wie ich aus der id 14472 dann den Title bekomme, den ich dann mit in die neue statische URL einfüge?
Was muss ich hierfür vll sogar an der artikel.php ändern, oder wie kann man das ganze überhaupt angehen und umsetzen?

Ich bedanke mich wieder einmal recht herzlich im Voraus bei allen die evtl. einen Tip für mich bereit haben.

Liebe Grüße
ViperTK

Verfasst:
von
Content Erstellung von ABAKUS Internet Marketing
Ihre Vorteile:
  • einzigartige Texte
  • suchmaschinenoptimierte Inhalte
  • eine sinnvolle Content-Strategie
  • Beratung und Umsetzung
Jetzt anfragen: 0511 / 300325-0

Re: artikel.php?id=14472 -> artikel/titel-des-eintrags-14

Verfasst: 11.05.2010, 20:26
von Mork vom Ork
ViperTK hat geschrieben:

Code: Alles auswählen

http://www.domain.de/artikel/14472/css-interview-mit-kai-kai-schafer-man-kann-nie-genug-fur-die-eps-vorbereitet-sein_css/
[…]
Was ich mir allerdings noch nicht erklären kann, wie ich aus der id 14472 dann den Titel bekomme, den ich dann mit in die neue statische URL einfüge?
Gar nicht – wenn man den Blick auf die RewriteRule-Zeile beschränkt. Das Muster für so eine URL wäre schlichtweg ^/artikel/([0-9]+)/ , d.h. der Pfad soll mit dem Text /artikel/ beginnen, dann folgen Ziffern, die kopiert werden (runde Klammern), und dann: ein offenes Ende. Alternativ könnte man auch ^/artikel/([0-9]+)/[^/]+/$ benutzen, statt des offenen Endes verlangt das Muster eine Zeichenkette ohne Schrägstrich ([^/]+) und dann am Ende einen Schrägstrich.

Der Punkt ist, dass mod_rewrite zur Arbeit mit Mustern gedacht ist, die auf viele Pfade passen. In deiner Zeile RewriteRule ^([^./]+)/([^/.]+)$ $1.php?site=$2 benutzt du doch auch keine festen Vorgaben, sonst wäre es ja RewriteRule ^([^./]+)/showdetails$ $1.php?site=$2 gewesen.
Genauso ist es beim Umgang mit Titeln in der URL auch.

Den eigentlichen Abgleich, also die Frage, ob der Titel aus der URL auch zum Titel des Artikels passt, musst du in dem Skript machen, dass die URLs weiterverarbeitet, denn nur dieses hat Zugriff auf die Artikeldatenbank.

Verfasst: 11.05.2010, 20:57
von ViperTK
Vielen Dank für deinen Post =).

Okay, also muss ich nun alle URL's selbst umschreiben? Versteh nur nicht wie ich das machen soll. Im Script muss ich dann also überall wo ich früher z.B. index.php?site=showdetails&id=3 hatte direkt dort beim dynamischen erstellen der URL's, meine Datenbankanfrage erweitern, so dass ich dann auch an den titel komme und nicht nur an die id, dass ich dann sowas machen kann wie: index.php?site=showdetails&id=3&title=dies-ist-der-title ?

Ist das korrekt bis hierhin?

Desweiteren brauche ich doch dann sicher noch eine zusätzliche Funktion die mir aus dem Original-Titel eine URL-freundliche Version macht.
Wäre meine folgende Lösung soweit komplett?

Code: Alles auswählen

function title_to_url($title) {
$umlaute = Array("/ä/","/ö/","/ü/","/Ä/","/Ö/","/Ü/","/ß/","/&/","/
/","/\?/","/\!/","/\./","/\(/","/\)/","/\,/","/\//","/%/","/#/","/\"/","/:/
","/;/");
$replace = Array("ae" ,"oe" ,"ue" ,"Ae" ,"Oe" ,"Ue" ,"ss" ,"und", "-"
,"" ,"" ,"-" ,"" ,"" ,"" ,"-" ,"" ,"" ,"" ,"","");
$title = strtolower(preg_replace($umlaute,$replace,$title));
return $title;
}
Vielen Dank.

Liebe Grüße
ViperTK

Verfasst:
von
SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Verfasst: 12.05.2010, 11:06
von Mork vom Ork
Damit hier nichts durcheinander kommt, mal ganz grundsätzlich: Die URL-Umschreiberei besteht aus zwei voneinander unabhängigen Teilen, der Ausgabe und der Eingabe.

Mit RewriteRule-Zeilen erledigst du die Eingabe, d.h. ein Browser fragt nach einer "schönen" URL (/dings/bumms) und du bastelst daraus etwas Internes (/index.php?bla=dings;fasel=bumms), mit dem du weiterarbeiten kannst.

Damit der Browser aber weiss, welche URLs er anfragen soll, musst du diese zuvor im HTML-Code ausgeben; um das obige Beispiel fortzuführen: in einer HTML-Seite muss <a href="/dings/bumms"> stehen. Das ist eine Sache, die vollkommen separat von mod_rewrite läuft, denn dieses Modul kümmert sich nur im die Eingabe.
ViperTK hat geschrieben:Im Skript muss ich dann also überall, wo ich früher z.B. [<a href="index.php?site=showdetails&id=3">] hatte, […] meine Datenbankanfrage erweitern, so dass ich dann auch an den titel komme und nicht nur an die id
Richtig.
dass ich dann sowas machen kann wie: [<a href="index.php?site=showdetails&id=3&title=dies-ist-der-titel">]?
Falsch. <a href="/showdetails/1/dies-ist-der-titel"> möchtest du haben.


Beachten solltest du ferner, dass Ein- und Ausgabe Hand in Hand arbeiten, ein eingegebener Pfad sollte schon komplett stimmen. Überprüfst du in den Pfaden nur die Artikelnummer, kann ein Scherzbold statt des eigentlichen Pfades /artikel/1234/Tolle-Geschichte-zu-Himmelpfad beispielsweise /artikel/1234/Der-Autor-dieser-Webseiten-ist-eine-dumme-Sau verbreiten, ohne, dass dein Server darauf mit einem Fehler reagiert (und das ist doch sicher falsch :). Das bedeutet, dass du in jedem Fall neben der Artikelnummer auch den (Teil-) Pfad in der Artikeldatenbank speichern musst, um ihn vergleichen zu können.

Desweiteren brauche ich doch dann sicher noch eine zusätzliche Funktion die mir aus dem Original-Titel eine URL-freundliche Version macht.
Wäre meine folgende Lösung soweit komplett?

Code: Alles auswählen

function title_to_url&#40;$title&#41; &#123;
$umlaute = Array&#40;"/ä/","/ö/","/ü/","/Ä/","/Ö/","/Ü/","/ß/","/&/","/
/","/\?/","/\!/","/\./","/\&#40;/","/\&#41;/","/\,/","/\//","/%/","/#/","/"/","/&#58;/
","/;/"&#41;;
$replace = Array&#40;"ae" ,"oe" ,"ue" ,"Ae" ,"Oe" ,"Ue" ,"ss" ,"und", "-"
,"" ,"" ,"-" ,"" ,"" ,"" ,"-" ,"" ,"" ,"" ,"",""&#41;;
$title = strtolower&#40;preg_replace&#40;$umlaute,$replace,$title&#41;&#41;;
return $title;
&#125;
Jetzt mal abgesehen davon, dass preg_replace() eigentlich fehl am Platze, weil im Gegensatz zu str_replace() viel zu aufwändig ist, würde ich an deiner Stelle gar keine automatische Ersetzerei benutzen, sondern einen kurzen, sinnvollen Namen von Hand eingeben.

Diese Bandwurm-Pfade haben sich in den letzten Jahren wie die Pest ausgebreitet und bieten, außer zum Behumpsen von Suchmaschinen, keinen Nutzen. Ich weiss nicht, wie es derzeit aussieht, aber ich vermute, dass Google solche URLs über kurz oder lang als das einordnet, was sie sind: Suchmaschinen-Spam.
Außerdem sehen diese verkrüppelten Sätze scheiße aus.

Da du, wie oben geschrieben, den Pfad sowieso in der Datenbank speichern müsstest, um eine Gegenprüfung zu machen, und eine Änderung wie oben sich nicht "zurückrechnen" lässt (jedes ö ist beim Kodieren ein oe, aber nicht jedes oe ist beim Dekodieren ein ö, von den gelöschten Zeichen ganz zu schweigen), also eigentlich für diese Prüfung nutzlos ist, spricht nichts dagegen, das beim Anlegen eines Artikels gänzlich von Hand zu machen.

Verfasst: 12.05.2010, 14:40
von ViperTK
Vielen Dank wieder für deine ausführliche Antwort =).

Ja die Punkte die du ansprichst habe ich mir schon so gedacht, bzw. waren mir auch soweit schon klar.
Mork vom Ork hat geschrieben:
ViperTK hat geschrieben:Im Skript muss ich dann also überall, wo ich früher z.B. [<a href="index.php?site=showdetails&id=3">] hatte, […] meine Datenbankanfrage erweitern, so dass ich dann auch an den titel komme und nicht nur an die id
Richtig.
dass ich dann sowas machen kann wie: [<a href="index.php?site=showdetails&id=3&title=dies-ist-der-titel">]?
Falsch. <a href="/showdetails/1/dies-ist-der-titel"> möchtest du haben.
Ah okay, also versteh ich richtig, dass ich zwar im Script [<a href="/showdetails/1/dies-ist-der-titel">] angebe, aber bei den RewriteRules den dritten Parameter, also in dem Fall [dies-ist-der-titel] ignoriere, meine Umleitung also weiterhin [<a href="index.php?site=showdetails&id=3">] bleibt?
Mork vom Ork hat geschrieben: Beachten solltest du ferner, dass Ein- und Ausgabe Hand in Hand arbeiten, ein eingegebener Pfad sollte schon komplett stimmen. Überprüfst du in den Pfaden nur die Artikelnummer, kann ein Scherzbold statt des eigentlichen Pfades /artikel/1234/Tolle-Geschichte-zu-Himmelpfad beispielsweise /artikel/1234/Der-Autor-dieser-Webseiten-ist-eine-dumme-Sau verbreiten, ohne, dass dein Server darauf mit einem Fehler reagiert (und das ist doch sicher falsch :). Das bedeutet, dass du in jedem Fall neben der Artikelnummer auch den (Teil-) Pfad in der Artikeldatenbank speichern musst, um ihn vergleichen zu können.
Mh du meinst also, dass ich in der Datenbank überall dort wo ich einen Titel eintrage, den ich nachher für das mod_rewrite benutzen möchte entweder ein weiteres feld vorsehe, wo ich dann per hand einen weiteren titel eingeben kann, der dann für die statische domain steht. Oder aber, mir beispielsweise per urlencode-funktion, welche ich übrigens nun auch gegen diese miese funktion von mir ausgetauscht habe, aus dem eigentlichen titel selbst einen zusatztitel für die statische domain anlegen lasse und zusätzlich in der datenbank speichere.

Sofern das nun richtig ist, muss ich dann aber im Gegensatz zum oben erwähnten doch den Parameter [dies-ist-der-titel] mit übergeben bei der Weiterleitung um zu prüfen, ob alles rechtens ist.
Mork vom Ork hat geschrieben: Diese Bandwurm-Pfade haben sich in den letzten Jahren wie die Pest ausgebreitet und bieten, außer zum Behumpsen von Suchmaschinen, keinen Nutzen. Ich weiss nicht, wie es derzeit aussieht, aber ich vermute, dass Google solche URLs über kurz oder lang als das einordnet, was sie sind: Suchmaschinen-Spam.
Außerdem sehen diese verkrüppelten Sätze scheiße aus.
Dazu gibts übrigens einen sehr interessanten Artikel =).

https://googlewebmastercentral-de.blogs ... -urls.html
Sollte ich meine dynamischen URLs in statisch aussehende URLs umwandeln?
Wir haben im Folgenden ein paar Punkte zusammengetragen, die ihr beachten solltet, wenn ihr dynamische URLs benutzt.

1. Es ist ziemlich schwer, eine dynamische URL in richtiger Weise in eine statisch aussehende URL umzuwandeln und diese dann zu pflegen.
2. Es ist viel besser, wenn ihr uns die ursprüngliche dynamische URL anbietet und es uns überlasst, problematische Parameter aufzuspüren und zu umgehen.
3. Wenn ihr eure URL umschreiben wollt, so könnt ihr unnötige Parameter entfernen, solltet aber die dynamisch aussehende URL beibehalten.
4. Wenn ihr eine statische URL anstelle einer dynamischen URL anbieten wollt, solltet ihr eine statische Kopie des dazugehörigen Contents erstellen.
Aber selbstverständlich sehe ich das in vielen Punkten ganz genauso wie du. Nur versuch mal den "Kunden", denen du ein Script baust, weiss zu machen, dass es so schwachsinnig ist und absolut scheiße aussieht. Die meisten haben das irgendwo gesehen und wollen das dann eben genauso umgesetzt haben..naja der Kunde is eben König :/. Auch wenn ich das zu meinem Bedauern leider immer häufiger feststellen muss.

Liebe Grüße

Verfasst: 13.05.2010, 11:33
von Mork vom Ork
ViperTK hat geschrieben:Ah okay, also versteh ich richtig, dass ich zwar im Script <a href="/showdetails/1/dies-ist-der-titel"> angebe, aber bei den RewriteRules den dritten Parameter, also in dem Fall [dies-ist-der-titel] ignoriere, meine Umleitung also weiterhin <a href="index.php?site=showdetails&id=3"> bleibt?
Das Muster für eine URL à la /showdetails/1/dies-ist-der-titel sollte in etwa ^([^./]+)/([\d]+)/([^/]+)$ sein, damit greifst du showdetails, 1 und dies-ist-der-titel ab.

Du kannst natürlich den Titelabschnitt auch ignorieren und ^([^./]+)/([\d]+)/ benutzen. Zur reinen Funktion braucht es ja nur showdetails und die Artikelnummer, der Titel ist nur, wie geschrieben, zur Absicherung:
Beachten solltest du ferner, dass Ein- und Ausgabe Hand in Hand arbeiten, ein eingegebener Pfad sollte schon komplett stimmen.
Mh du meinst also, dass ich in der Datenbank überall dort wo ich einen Titel eintrage, den ich nachher für das mod_rewrite benutzen möchte entweder ein weiteres feld vorsehe, wo ich dann per hand einen weiteren titel eingeben kann, der dann für die statische domain steht. Oder aber, mir beispielsweise per urlencode-funktion, welche ich übrigens nun auch gegen diese miese funktion von mir ausgetauscht habe, aus dem eigentlichen titel selbst einen zusatztitel für die statische domain anlegen lasse und zusätzlich in der datenbank speichere.
Genau. URL (lies: den kodierten Titel) in die Datenbank und beim Aufruf abgleichen; falls gegebene URL nicht mit Datenbank-URL übereinstimmt, 404 liefern.