Zum Inhalt springen

Frage zum maskieren von URLs OHNE mod_rewrite


dhintze

Empfohlene Beiträge

Hallo Forum,

ich möchte meinen php-webshop gerne für Suchmaschinen optimieren und zu diesem Zweck die unschönen php Parameter-URLs á la index.php?id=a&artikel=b maskieren diese Form: a/b/index.htm. Dieses aber ohne mod_rewrite (da Strato dies leider nicht unterstützt).

Ich habe dazu auch eine schöne Anleitung gefunden unterSuchmaschinenfreundliche PHP-Seiten entwickeln - Artikel von www.it-academy.cc - Verein für Informationstechnologie

Hier davon der interesante Teil:

* Eine .htaccess - Datei: "ErrorDocument 404 /content.php"

(Diese wird aufgerufen, wenn keine Datei mit dem aufgerufenen Namen gefunden wurde)

* Eine von PHP schon vordefinierte Variable: $REQUEST_URI

(Diese enthält die (erfolglos) aufgerufene URL)

* Die PHP - Funktion header()

(Damit kann dem Besucher vorgegaukelt werden, das Dokument wäre doch gefunden worden, sonst zeigen manche Browser (*** - Ich hasse dich!) nicht das vom Server gelieferte Dokument an, sondern eine eigene Seite)

------------

Die Variable $REQUEST_URI kann vom PHP - Skript beliebig ausgewertet werden, z. B. können einzelne Teile daraus in einer SQL-Abfrage eingebaut werden.

Der Ablauf ist folgender:

1. Das Skript prüft, ob die $REQUEST_URI Sinn macht, wenn nicht, kann mit include() die eingentliche Fehlerbehandlungsseite ausgegeben werden.

2. Wenn $REQUEST_URI Sinn macht, wird zuerst (bevor andere Ausgaben durchgeführt werden!) die Fkt. header() aufgerufen: "header("HTTP/1.1 200 OK");"

3. Dann wird der normale, dynamische Content erzeugt und ausgegeben.

Fertig.

Z.B. könnte ein Aufruf von

"http://www.beispiel.com/Tabellenname/Spaltenname/Muster.htm"

in ein SQL-Query umgesetzt werden, wobei in der Tabelle "Tabellenname" alle Zeilen ausgegeben werden, die in der Spalte "Spaltenname" das Muster "Muster" matchen (z. B. via Regular Expressions).

Ergo: Ich habe eine URL, die wie eine normale URL zu einer normalen HTML-Datei aussieht, in Wirklichkeit existieren weder das Verzeichnis, noch eine Datei mit diesem Namen. Ich könnte sogar so weit gehen, alle Binärdateien ebenfalls in der DB zu speichern (z. B. als BLOB), dann wären im Dateisystem nur noch genau zwei Dateien enthalten (1 x PHP, 1 x .htaccess).

Funktioniert soweit auch ganz gut (ein bisschen tricky ist es nur mit Formularen und relativen Links).

Nun meine Frage: Hat jemand Erfahrung mit dieser Technik und speziell wie sie sich auf Suchmaschinen auswirkt? Die W3C-Validitierung funz z.B. nicht (error404). Wäre sehr dankbar für Erfahrungsbericht (oder auch Alternativvorschläge).

Gruß, Daniel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nun meine Frage: Hat jemand Erfahrung mit dieser Technik und speziell wie sie sich auf Suchmaschinen auswirkt?

Mit der von dir aufgeführten Methode über eine 404-Seite nicht.

Ich mach das bei mir anders. Du solltest prüfen, ob bei dir AcceptPathInfo auf On steht, geht auch in der .htaccess (siehe Apache 2 - Direktiven - AcceptPathInfo - Sascha Kersken).

Wenn das der Fall ist, kannst du eine URL:

index.php/modul/id/modulname.html

verwenden. Dabei wird die Seite index.php aufgerufen und dort zerlegst du dann die URL (REQUEST_URI) und kannst z.B. die für dich relevanten Daten da auswerten. Beim aufbauen der Links machst du das entsprechend, nur umgekehrt.

Ich hab z.B. 2 Funktionen (URLToSEF und SEFToURL).

In der Funktion URLToSEF wandel ich normale GET-Urls in SEF (SearchEngineFriendly) URLs um. Dazu such ich das ? in der URL und nehm alles danach. Das wird gesplittet an den & und das Ergebnis dann nochmal an den =.

Raus kommt dann eine URL: index.php/param1,value1/param2,value2...

Der Name der aufzurufenden Seite (bei mir Parameter page) wird nochmal am Ende gefolgt von .html angehängt. Bsp:

index.php/page,News/News.html

Umgekehrt geht es genauso. index.php und Name.html abschneiden (alles vor bzw hinter dem ersten bzw letzten /, dann splitten an /, gefolgt vom Split an ,. Das Ergebnis wird als $_GET abgelegt.

Bsp:

$_GET["page"] = "News"

Das machst du ganz am Anfang und im weiteren Skriptverlauf braucht dich das gar nciht zu interessieren und du arbeitest wie wenn das gar nciht vorhanden wäre. Somit läßt sich das auch ganz einfach über eine Option ein- bzw ausschalten.

Der Umweg über 404 ist doch dummes zeug :D

(Bei den Apaches hier hat das immer direkt funktioniert so, wenn nicht geht es über die .htaccess. Und wenn auch das nicht geht, dann kannst du bestimmt auch keine eigene Fehlerseite benutzen ;) )

EDIT:

Du musst halt dann jeden Link den du ausgibst durch eine Funktions laufen lassen. Je nach Einstellung wird der Link dann nach SEF umgewandelt und zurückgegeben oder eben nicht. Ich benutze diese Funktion auch dazu, um den aktuellen Aufruf zu übernehmen und weitere Parameter anzuhängen z.B. oder die Parameterliste komplett neu zu schreiben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mal eine Frage am Rande: Bringt die URL-Maskierung wirklich was? Ich bin bisher davon ausgegangen, daß die Suchmaschinen den Inhalt verwerten, nicht die Links...ist denen das nicht absolut egal, wie die URLs aussehen?

Es ist ihnen nicht absolut egal. Und Parameter werden weggelassen (nicht alle wohl, aber einige). Wenn du jetzt ein CMS hast, dann hast du da eine Datei (index.php) und die wird immer wieder aufgerufen, mit anderen Parametern um andere Inhalte zu zeigen. Diese Parameter müssen von den Suchmaschinen auch übergeben werden um an die Inhalte zu kommen. Ansonsten wird im schlechtesten Fall nur deine Startseite indiziert.

Auch bei der Bewertung deiner Seite für den Suchbegriff "Webdesign" (z.B.) wird eine Seite mit der url web/design/webdesign.html besser bewertet als dieselbe Seite mit hinz/kunz/bla.html. Zudem spielt die Domain noch eine wichtige Rolle. www.webdesign.tld/web/design/webdesign.html ist wohl als sehr gut anzusehen.

Beim c't-Wettbewerb (Hommingberger Gepardenforelle - Wikipedia) hat sich das auf jeden Fall bestätigt.

Sinnvolle URLs sind auf jeden Fall von Vorteil.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die Hinweise und die Einschätzung der Lage!

index.php/modul/id/modulname.html

Ich werde mich mal mit dieser Technik auseinander setzten. Bin auch schon mal irgendwo darauf gestoßen. Wenn man mittels .htaccess die von php geparsten Dateitypen so umbiegt das auch Dateien ohne ".Dateityp" geparst werden kann man die URL sogar so hinbekommen:

index/modul/id/modulname.html

Fand ich auch ganz interessant...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn man mittels .htaccess die von php geparsten Dateitypen so umbiegt das auch Dateien ohne ".Dateityp" geparst werden kann man die URL sogar so hinbekommen:

index/modul/id/modulname.html

Fand ich auch ganz interessant...


AddType application/x-httpd-php *

Wobei ich nicht sicher bin, ob da ein * oder sonst was stehen muss. Aber fall es ein * als Platzhalter für alles ist, dann sollten alle Anfragen durch den PHP-Interpreter gejagt werden.

Nur: Eine Anfrage wie du sie da zeigsthne mod_rewrite nicht möglich! Was du da anfrägst ist für den Server ein Pfad, bzw die Datei modulname.html im Pfad index/modul/id. Mit mod_rewrite könntest du diese URL umbiegen bevor der Apache die Datei modulname.html lesen will (in der Datei .htaccess z.B.), aber ohne kannst du das vergessen IMHO.

Mit AcceptPathInfo On bricht der Apache die Anfrage ja ab, sobald er eine Datei findet und der Pfad hintendran wird ignoriert (für die Dateianfrage).

Hmm...

Was du machen könntest wäre, eine Datei index anlegen ohne Endung. Die könnte dann wohl die Anforderungen erfüllen. Aber das ist doch sehr speziell und außer dir (im Moment, sprich wer weiß ob du dich in 1 Jahr noch daran erinnerst o.ä.)) wird da keiner durchblicken. Ich würde das so auf keinen Fall machen.

Aus dem Grund hab ich meine Funktion oben auch so gehalten, dass bis auf die beiden Funktionen nichts anders ist. Du programmierst alles wie immer, nur rufst du am Anfang vom Skript die eine Funktion, und beim Ausgeben von Links die andere auf.

Alles andere macht dir nur Ärger (oder dem der das Projekt irgendwann mal übernimmt).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was du machen könntest wäre, eine Datei index anlegen ohne Endung.

Das war die Idee. Soll angeblich auch funktionieren. Allerdings auf meinem lokalen XAMPP mit Windows darunter nicht.. werd es mal bei Strato test.

Mir gefällt deine Lösung gut, das einzige was mit stört ist, dass quasi zwei Dateiendungen in der URL vorkommen. Ich bin zwar keine Suchmaschine, könnte mir aber vorstellen das diese nur die erste Dateiendung interpretieren?

Meine Lösung unterscheidet sich auch gar nicht sooo wesentlich von deiner. Ich hab auch am Anfang meiner Datei ein Script was die Übergebene URL zerlegt, prüft ob die Angefragte Datei vorhanden ist und ggf. auch eine "richtige" error404 Page bringt. Mit Browsern funktioniert es auch perfekt. (Ich lad mal ein Beispiel hoch, sobald die T-Com nach nun 2 Monaten meinen Anschluss wieder gängig hat...).

Einzig es ist hakelich Formularinhalte zu übergeben, da die bei der Umleitung auf die 404-Page verständlicherweise abgehängt werden...

Aber eine Suchmaschine benimmt sich ja - IMHO - wie ein Textbasierter Browser, oder? Und müsste sich daher auch von der

header("HTTP/1.1 200 OK");

Funktion überlisten lassen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mir gefällt deine Lösung gut, das einzige was mit stört ist, dass quasi zwei Dateiendungen in der URL vorkommen. Ich bin zwar keine Suchmaschine, könnte mir aber vorstellen das diese nur die erste Dateiendung interpretieren?

[...]

Aber eine Suchmaschine benimmt sich ja - IMHO - wie ein Textbasierter Browser, oder? Und müsste sich daher auch von der

header("HTTP/1.1 200 OK");

Funktion überlisten lassen?

Eine Suchmaschine interpretiert erstmal gar nichts an Endungen, deswegen hat das mit den Header auch nichts zu tun. Entscheidend für den Robot ist das, was er vom Server geliefert bekommt. Also aus geliefertem Inhalt (Code 200) kann der robot nicht einfach Seite nicht gefunden (404) machen, wenn der Server die Seite liefert.

Also auch die 2 "Endungen" machen eigentlich nichts aus und die letzte Endung bei mir ist ja nur dafür da, weil es besser aussieht ;) Eigentlich könnte man das auch weglassen und es würde genauso funktionieren. Nur ist es für den Besucher zum einen besser zu verstehen, wenn da eine URL mit Name.html steht.

Der "Erfolg" im Suchmaschinen-Ranking unserer Seite seit der Umstellung auf unser eigenes CMS (mit der o.g. Funktion bzw. mit mod_rewrite, aber das ist nach demselben Prinzip gemacht vom Aufbau. Das ist ja nur ein Fallback, wenn mod_rewrite nicht geht) zeigt mir, dass das alles nicht verkehrt war :D

(2 eher allgemeine Suchbegriffe (mit Bezug zum Thema) auf Rang 2 bei Seiten aus Deutschland. Allerdings die beiden Begriffe andersherum nur Platz 25 :confused:)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eine Suchmaschine interpretiert erstmal gar nichts an Endungen

Okay, hab mich ein bisschen missverständlich ausgedrückt. Meinte eigentlich den Datei Namen, den Suchmaschinen angeblich auch interpretieren?

Suchmaschinen: Wie wichtig ist der Dateiname?

Wobei dann die Frage wäre ob die URL nur als String durchsucht wird oder tatsächlich in Verzeichnisse und Dateiname zerlegt wird... DANN könnte es sein das man ein klein wenig schlechter da steht, wenn die Suchmaschine immer nur "index.php" als Datei annimmt anstelle von z.B. "content.htm".

...aber vieleicht übertreibe ich es langsam auch mit dem SEO...

Hab dank für deinen Rat!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wobei dann die Frage wäre ob die URL nur als String durchsucht wird oder tatsächlich in Verzeichnisse und Dateiname zerlegt wird... DANN könnte es sein das man ein klein wenig schlechter da steht, wenn die Suchmaschine immer nur "index.php" als Datei annimmt anstelle von z.B. "content.htm".

Also wenn ich von Windowsprogrammiersprachen ausgehe (bei php weiß ich da im Moment gar nichts), dann geben einem die entsprechenden Funktionen um einen Dateinamen aus einem String inkl. Pfadangabe immer die letzte "Datei" zurück.

Ein Punkt hat ja mit einer Datei nichts zu tun.


vi a.test/test2.txt

wird ohne Probleme vom System ausgeführt und editiert die Datei test2.txt, die im Ordner a.test liegt.

EDIT:

wie heißt es auch so schön: Alles ist eine Datei. (Also auch Verzeichnisse sind nichts anderes als eine Datei, nur ohne Inhalt eben ;) )

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...