Seite 1 von 2

Grundsätzliche Fragen

Verfasst: 13.01.2009 15:55
von gecko
Hallo erst mal,

ich beschäftige mich jetzt seit ein paar Tagen intensiv mit "mod_rewrite" und "Suchmaschinenfreundlichen URL". Ich habe so ziemlich das gesamte Forum hier durchgelesen und alle bekannten Suchmaschinen gequält! Ich habe ungefähr eine Milliarde "Rewrite Rules" gelesen und Informationen über "Anpassungen im Script" bzw. "Scripte in einer extra Datei" und "Linkanpassung", "urlencode", "urldecode" und was weiß ich nicht alles gefunden. Aber irgendwie kenne ich mich jetzt weniger aus als zuvor...

Das mit den "Rewrite Rules" ist eigentlich recht einleuchtend (und hier auch vielfach und spitzenmäßig erklärt), ich habe eine gewisse Ahnung von PHP, MySQL, .htaccess usw. aber ich bekomme es einfach nicht gebacken! Es fehlt einfach der "Zündfunke"!

Eigentlich sollte es doch recht einfach sein:
ich habe URLs in der Form "meineseite.de/product_detail.php?id=27"
daraus soll werden: "meineseite.de/100-gramm-Gammelfleisch.html" (und natürlich bei anderen id`s dementsprechend andere html-Seiten) und diese dann (wenn ich das richtig verstanden habe) per "mod-rewrite" an die URL "meineseite.de/product_detail.php?id=27" um- bzw. zurückgeleitet werden.
Aber da klemmt es schon...

In der index.php wird das wie folgt aufgerufen:
<a href="product_detail.php?id=<?=$row[0]?>"><strong><?=$row[2]?></strong></a><br>
Mit "$row[0]" wird die id and die URL gehängt und mit $row[2] der Artikeltitel in der Übersicht angezeigt.

Wenn ich jetzt das "$row[2]" folgendermassen an die URL anhänge
<a href="product_detail.php?id=<?=$row[0]?> <?=$row[2]?>"><strong><?=$row[2]?></strong></a><br>
kommt folgender Link bei raus:
meineseite.de/product_detail.php?id=27 100 gramm Gammelfleisch

Das klappt so natürlich nicht. Komme zwar auf die product_detail Seite aber die ist leer weil keine Daten aus der DB übernommen werden.
Wahrscheinlich ist der Ansatz schon komplett falsch aber ich habe sonst echt keine Idee mehr wie ich das machen soll!
Habe auch schon mit "urlencode", "preg_replace", "str_replace" usw. rumgebastelt weil ja auch die Leerzeichen (und sonstige Sonderzeichen die im Artikeltitel stehen wie z.B. @) raus bzw. durch "-" ersetzt werden müssen und dann evtl. noch ein ".html" ans Ende soll aber das klappt alles nicht...

Ich würde mich riesig freuen wenn mir einer der Profis hier weiter helfen könnte!
Vielen Dank schon mal.

Der Gecko

Verfasst: 13.01.2009 19:01
von Gumbo
Wahrscheinlich ist der Ansatz schon komplett falsch aber ich habe sonst echt keine Idee mehr wie ich das machen soll!
Habe auch schon mit "urlencode", "preg_replace", "str_replace" usw. rumgebastelt weil ja auch die Leerzeichen (und sonstige Sonderzeichen die im Artikeltitel stehen wie z.B. @) raus bzw. durch "-" ersetzt werden müssen und dann evtl. noch ein ".html" ans Ende soll aber das klappt alles nicht...
Was du hier beschreibst, ist genau das, was du machen musst.

Am besten schreibst du dir erst einmal eine Funktion, mit der du die URLs aus den Titeln generieren kannst, beispielsweise:

Code: Alles auswählen

functio prepareUrlComponent($component)
{
    $component = preg_replace('/[^a-zA-Z0-9]+/', '-', $component);  // entfernt unerlaubte Zeichen
    $component = trim($component, '-');
    return $component;
}
Diese kannst du dann wie folgt nutzen:

Code: Alles auswählen

<a href="/<?=prepareUrlComponent($row[2])?>.html">
Damit werden schon mal die richtigen URLs generiert und ausgegeben.

Verfasst: 14.01.2009 12:18
von gecko
Hallo Gumbo,

das funktioniert Spitze! Vielen herzlichen Dank!
Da wäre ich wahrscheinlich nie drauf gekommen...

Damit das alles jetzt aber nicht gar so einfach wird :lol: habe ich die URL noch mal erweitert.
Laut deinem Beispiel habe ich folgenden Aufruf in der index.php:

<a href="/<?=prepareUrlComponent($row[2])?>.html"><strong><?=$row[2]?></strong></a><br>

da kommt folgendes bei raus:

"meineseite.de/100-gramm-Gammelfleisch.html"

Ich wollte jetzt noch die Rubrik mit einbauen (z.B. Spezialitäten).
Diese rufe ich folgendermassen auf:
<?=prepareUrlComponent($row[1])?>-

Dann habe ich noch gelesen das man die ID mit übergeben soll damit das auch gefunden wird.
Dazu habe ich am Ende folgendes eingegeben:
-<?=$row[0]

Der komplette Aufruf ist also folgender:

<a href="/<?=prepareUrlComponent($row[1])?>-<?=prepareUrlComponent($row[2])?>-<?=$row[0]?>.html"><strong><?=$row[2]?></strong></a><br>

da kommt folgendes bei raus:

"meineseite.de/Spezialitäten-100-gramm-Gammelfleisch-27.html"

Das ist schon mal alles schön und gut, aber ich fummle jetzt wieder seit Stunden an "RewriteRule" und "RewriteCond" rum und es will einfach nicht klappen...

Jetzt meine Frage:
macht das alles so überhaupt Sinn oder ist das alles ein Schmarrn?
Einerseits lese ich das man die ID in die URL mit einbauen soll, andererseits steht dann wieder irgendwo das man die ID über eine "RewriteCond" übergeben soll.
Was ist da jetzt richtig oder ist beides richtig? Wenn ja, was macht mehr Sinn?
Wenn die ID in die URL soll ist das dann so ok. wenn sie am Ende steht oder soll die am Anfang stehen? Oder ist das egal?
So habe ich jetzt natürlich 1 Million Varianten die ich durchprobieren kann und am Ende klemmt es "nur" an irgend einem Punkt...

Würde mich über Hilfe riesig freuen!

Der Gecko

Verfasst: 14.01.2009 12:57
von Gumbo
Mit folgender Regel kannst du Anfragen solcher Form wieder umschreiben:

Code: Alles auswählen

RewriteRule ^([^/-]+-)+(\d+)\.html$ /product_detail.php?id=$2 [L]

Kurzer Erklärung: Das „[^/-]+“ bedeutet ein oder mehrere Zeichen außer dem Schrägstrich und dem Bindestrich. Zusammen als „([^/-]+-)+“ bedeutet das, ein oder mehrere Wiederholungen der Folge beschrieben durch „[^/-]+“ (s.o.) gefolgt von einem Bindestrich. Das beschreibt Wörter wie „foo-“, „foo-bar-“, „foo-bar-baz-“ etc. oder eben auch „Spezialitäten-100-gramm-Gammelfleisch-“. Was jetzt noch übrig bleibt, ist das „\d“, was für die Zahlen 0–9 steht, sowie das „\.html“ am Ende.
Damit hätten wir einen regulären Ausdruck, der „Spezialitäten-100-gramm-Gammelfleisch-27.html“ beschreibt.

Verfasst: 14.01.2009 17:23
von gecko
Hallo Gumbo,

erst mal vielen Dank für den Code und die Erklärung. Ohne dich wäre ich hier sowieso komplett aufgeschmissen...
Leider klappt das aber nicht. Bekomme immer "Error 404 - Not found".
Ich dachte jetzt das liegt an der Pfadangabe. Hatte oben nicht daran gedacht das alles momentan in einem Unterordner liegt:
meine URLs sind also in der Form "meineseite.de/shop/product_detail.php?id=27"

Habe jetzt stundenlang an den Pfadangaben rumgefummelt und eigentlich sämtliche möglichen (und unmöglichen) Varianten ausprobiert.
Dabei habe ich auch wieder das halbe Forum durchsucht und mehrmals die FAQ zum "Error 404" durchgelesen, aber es haut einfach nicht...
Dachte mir noch es liegt vielleicht nicht am Pfad sondern die ID wird nicht übergeben und habe dann noch mit diversen "RewriteCond"`s experimentiert, aber das bringt mich alles nicht weiter...
Wahrscheinlich liegt es nur noch an einer Kleinigkeit, aber mittlerweile kann ich den "404" echt nicht mehr sehen :(
Würde mich über einen (hoffentlich letzten) Tipp riesig freuen!

Danke und viele Grüße

Der Gecko

Verfasst: 14.01.2009 17:41
von Gumbo
Du musst nur den Ersatz anpassen:

Code: Alles auswählen

RewriteRule ^([^/-]+-)+(\d+)\.html$ /shop/product_detail.php?id=$2 [L]
Die URLs sind ja weiterhin nur „/Spezialitäten-100-gramm-Gammelfleisch-27.html“, also ohne „shop“.

Verfasst: 14.01.2009 17:49
von gecko
Hallo Gumbo,

vielen Dank. Das geht ja hier wie das Brezelbacken :D
Das hatte ich aber auch schon in diversen Varianten probiert --> 404...

Der Gecko

Verfasst: 14.01.2009 19:10
von Gumbo
Wo setzt du denn diese Regel ein? Sie müsste in die .htaccess im Hauptverzeichnis.

Verfasst: 15.01.2009 12:52
von gecko
Hallo Gumbo,

ich bins schon wieder... :oops:
Ich hatte die .htaccess natürlich im Unterverzeichnis "/shop/". Wußte nicht dass die ins Hauptverzeichnis muss.
Habe die dann ins Hauptverzeichnis geschrieben und wieder stundenlang sämtliche Variationen durchexerziert, aber es klappt einfach nicht...

Das ganze liegt momentan auf einem 1und1 Server und ich habe hier gelesen dass das auch Probleme geben kann.
Habe auch mal mit dem Verzeichnis "/homepages/24/d????????/htdocs/" usw. rumprobiert, aber nix!
Langsam zweifle ich echt an meinem Verstand und wenn ich jetzt noch ein mal die "404" sehe fällt mir echt das Frühstück aus dem Gesicht...

Also nochmal von Anfang an:

ich habe den folgenden Code (von dir) in der index.php:

Code: Alles auswählen

functio prepareUrlComponent($component)
{
    $component = preg_replace('/[^a-zA-Z0-9]+/', '-', $component);  // entfernt unerlaubte Zeichen
    $component = trim($component, '-');
    return $component;
}


und den folgenden Link (auch von dir) in der index.php:

Code: Alles auswählen

<a href="/<?=prepareUrlComponent($row[1])?>-<?=prepareUrlComponent($row[2])?>-<?=$row[0]?>.html"><strong><?=$row[2]?></strong></a><br>


und das mit dem Unschreiben klappt auch prima!

In der .htaccess (jetzt im Hauptverzeichnis) steht folgendes (ebenfalls von dir :D ):

Code: Alles auswählen

RewriteEngine On
RewriteRule ^([^/-]+-)+(\d+)\.html$ /shop/product_detail.php?id=$2 [L]


Muss da noch irgendwas dazu? Eine "RewriteCond" oder eine "RewriteBase" oder was auch immer?
Habe jetzt schon unzählige Varianten und Möglichkeiten durchprobiert aber es will einfach nicht...
Würde mich über weitere Hilfe riesig freuen!

Der Gecko

Verfasst: 15.01.2009 13:25
von Gumbo
Ich hatte die .htaccess natürlich im Unterverzeichnis "/shop/". Wußte nicht dass die ins Hauptverzeichnis muss.
In diesem Fall muss sie ins Hauptverzeichnis, da bei einer Anfrage von „/Spezialitäten-100-gramm-Gammelfleisch-27.html“ nur die .htaccess im Hauptverzeichnis konsultiert wird. Erst bei „/shop/…“ würde auch die .htaccess im shop-Verzeichnis geprüft werden.

Dennoch zurück zu deinem Problem: Ich meine mich zu erinnern, dass ein bestimmter Anbieter bei sich das mod_rewrite so eingestellt hat, dass auch in „.htaccess“-Dateien die Suchanfragen mit einem Schrägstrich beginnen müssen, was eigentlich nur im Serverkonfigurationskontext nötig ist. Probier’s doch mal damit.

Verfasst: 15.01.2009 14:31
von gecko
Hallo Gumbo,

ich kann mich gar nicht oft genug für deine Hilfe bedanken (und vor allem für die schnellen Antworten)!!!

Ich habe es jetzt mit dem / versucht:

Code: Alles auswählen

RewriteEngine On
RewriteRule ^/([^/-]+-)+(\d+)\.html$ /shop/product_detail.php?id=$2 [L]


mit dem kompletten Pfad:

Code: Alles auswählen

RewriteEngine On
RewriteRule ^/homepages/24/d????????/htdocs/([^/-]+-)+(\d+)\.html$ /shop/product_detail.php?id=$2 [L]


und allen möglichen und unmöglichen Varianten daraus. Aber - 404!

Habe zwischenzeitlich hier im Forum gelesen dass man zum testen auf eine externe URL umleiten kann.
Z.B. so:

Code: Alles auswählen

RewriteEngine On
RewriteRule ^([^/-]+-)+(\d+)\.html$ http://www.meineseite.de [L]


Dachte mir dass vielleicht einfach die Zielseite nicht gefunden wird.
Auch das exzessiv durchprobiert - erfolglos...
Da ja alles Andere eigentlich passt, bedeutet das doch dass die RewriteRule den Pfad einfach nicht findet, oder?
Aber ich habe mittlerweile wirklich alles durchprobiert...

Viele Grüße

Der Gecko

Verfasst: 15.01.2009 14:58
von Gumbo
Ist das Modul denn überhaupt geladen? Funktioniert denn überhaupt irgendeine Regel? Probier mal folgende:

Code: Alles auswählen

RewriteRule ^ http://example.com/ [L,R]

Verfasst: 15.01.2009 15:56
von gecko
Ja, das ist geladen.
Das hatte ich schon ausprobiert...

Viele Grüße

Der Gecko

Verfasst: 15.01.2009 17:55
von Gumbo
Dann versuchen wir mal der Ursache auf den Grund zu gehen. Welche Regel der beiden folgenden wird angewendet?

Code: Alles auswählen

RewriteRule ^/ http://example.com/1 [L,R]
RewriteRule ^([^/]|$) http://example.com/2 [L,R]

Verfasst: 16.01.2009 12:29
von gecko
Hallo Gumbo,

habe jetzt mal ein paar Regeln durchprobiert:

Code: Alles auswählen

RewriteRule ^/ http://example.com/1 [L,R]

da passiert nix...

Code: Alles auswählen

RewriteRule ^([^/]|$) http://example.com/2 [L,R]

wird auf example.com/2 umgeleitet aber 404 weil es den Ordner 2 da wohl nicht gibt...

Code: Alles auswählen

RewriteRule ^ http://example.com/ [L,R] 

ohne "/" am Anfang und ohne "1" am Ende wird prima auf example.com umgeleitet!

Wenn ich das jetzt richtig sehe klemmt es also an der RewriteRule.
Habe daran wüst herumexperimentiert aber es ist nichts bei rausgekommen...

Damit beim testen nicht permanent mein kompletter Server auf example.com umgeleitet wird habe ich jetzt beim Link

Code: Alles auswählen

<a href="/<?=prepareUrlComponent($row[1])?>-<?=prepareUrlComponent($row[2])?>-<?=$row[0]?>.html"><strong><?=$row[2]?></strong></a><br> 

den "/" am Anfang entfernt.
Beim überfahren mit der Maus wird also jetzt der Link zum Unterverzeichnis

Code: Alles auswählen

"meineseite.de/shop/Spezialitäten-100-gramm-Gammelfleisch-27.html"

angezeigt und ich arbeite momentan an der ".htaccess" im Unterverzeichnis "shop".
Hoffe mal das ist so ok.

Du hattest weiter oben geschrieben "Kurzer Erklärung: Das „[^/-]+“ bedeutet ein oder mehrere Zeichen außer dem Schrägstrich und dem Bindestrich."
Wenn ich das richtig verstehe bezieht sich das auf den ersten Teil der URL, also die "($row[1])" = "Spezialitäten".
Da kann es allerdings auch Wörter mit Bindestrich geben. Z.B. "Spezialitäten-aus-Bayern" oder so.
Weiß jetzt nicht ob das überhaupt eine Bedeutung hat, ich hatte aber bisher sowieso nur Rubriken ohne Bindestrich angeklickt...

Vielen Dank schon mal und viele Grüße

Der Gecko