Moin!
Nachdem die ersten Suchmaschinen die Seite aufgenommen haben, habe ich festgestellt, dass dynamische Seiten mit Get-Parametern nicht
indiziert werden und natürlich schon in Erfahrung gebracht, dass
ich das Problem mit mod_rewrite in einer htaccess umgehen kann.
Diese Indizierungs-Aussage würde ich zwar so direkt nicht treffen wollen (bei Google gibt es genug Fundseiten, die das Gegenteil beweisen), aber nichtsdestotrotz ist der Ansatz, vernünftige, ausgeschriebene URLs zu benutzen, die keine Parameter haben, natürlich viel besser.
Die neuen Verweise würden dann so aussehen:
a) http://www.oldschool.de/page/about_links
b) http://www.oldschool.de/page/skate/history/
Tu dir selbst einen Gefallen und nimm vernünftige URLs.
/about_links.html
/skate/history/index.html
Warum /page/ da reinfriemeln? Ist überflüssig und bringt der URL nichts, macht sie nur unnötig lang. Es sei denn, du hast einen strukturbedingten, guten Grund, "Seiten" in ein Verzeichnis "page" zu pflanzen.
Andererseits sind die .html-Geschichten ihrerseits nicht verkehrt. Da ist mehr "Macht der Gewohnheit" dabei, aber Seiten haben nun mal typischerweise eine Endung, weil Dateien aus Unterscheidungsgründen bei den meisten Betriebssystemen auch eine haben.
Wenn ich das so umsetze, muss ich dann damit rechnen, dass
die Suchmaschinen in Beispiel a einen abschließenden Slash '/'
dranhängen und mir damit den Parameter zerstören würden?
Nein. Das kann dein Webserver schon ganz alleine. Ist alles eine Frage, wie er reagiert (jetzt aktuell), wenn du eine existierende URL ohne Endslash aufrufst, und der Webserver einmal eine Datei gleichen Namens, und einmal ein Verzeichnis entdeckt.
Falls ja, gibt es eine elegante Lösung dieses Problem zu umgehen?
Ich setze mod_rewrite für solche Aktionen, wie du sie vorhast, sehr gerne und erfolgreich ein. Ich hatte bislang noch keinerlei Probleme mit meiner Vorgehensweise.
Versaut mod_rewrite eigentlich die Pfadangaben? Ich meine,
aus allen Dateien verweise ich z.B. bei Bildern zu images/bild.* ,
müsste ich dann bei Beispiel b) auf ../../../../images/bild.*
verweisen? Das wäre sehr ungünstig...
Ja, die Pfadangaben werden "versaut". Das ist aber nicht Schuld von mod_rewrite, sondern vom Browser. Bzw. deiner URL-Gestaltung.
Mit deinen Parametern hast du immer dieselbe Seite abgerufen: /index.php. Relativ zu dieser Seite befinden sich natürlich dann immer die gleichen Bilder, bzw. egal welche Seite du aufrufst, eine relative Adressierung auf ein vorhandenes Bild ist immer gleich.
Aus diesem Grunde gibt es die segensreiche Erfindung der absoluten Adressierung. Die funktioniert dann zwar nicht mehr auf der heimischen Festplatte, sondern nur noch mit Server - aber das ist mit PHP ja nicht anders. Anstatt als unterschiedliche Kaskaden von "../../../../images/bild.jpg" je nach Verzeichnistiefe deiner URL einzubauen, setzt du den Bildsrc direkt auf "/images/bild.jpg". Und fertig.
Da du deine Links auf allen Seiten ja auch auf die neue URL-Schematik umändern mußt (da sind Parameter natürlich verboten, weil genau deshalb die Suchmaschine ja erst drauf kommen, Parameter bei dir zu verwenden, bzw. einfach den existierenden Links folgen), ist das also nur eine kleine Zusatzaufgabe. Kann man mit dateiübergreifendem Suchen/Ersetzen sehr schnell hinbekommen.
Wie die ModRule aussehen müsste frage ich lieber nicht, ich weiß
dafür gibt's ein tutorial...
...und tolle Einträge im Archiv, die mir alle viel zu kompliziert erscheinen.
Klar, man _kann_ das Auseinandernehmen und Umsetzen der Eingangs-URL in eine Ausgangsurl mit tollen Parametern auch im Rewriting-Modul machen.
Muß man aber nicht.
Meine Variante ist relativ puristisch, verlangt aber etwas Mitarbeit vom angeschlossenen PHP:
Virtuelle Struktur
# Alle Zugriffe auf / umleiten auf die Seitenauslieferung
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -s
RewriteRule ^/.+.html$ /backoffice/page.php
Das leitet _alle_ Requests, die auf ".html" enden, auf das Seitenauslieferungsskript um. Die RewriteCond prüft, ob im Verzeichnisbaum eine entsprechende Datei tatsächlich existiert.
Der Sinn dahinter ist: Die URL-Struktur ist, wie oben angedeutet:
/index.html
/andere_seite.html
/verzeichnis/index.html
/verzeichnis/seite.html
Exakt diese Dateien existieren auf dem Server auch. Allerdings sind das keine vollwertigen, statischen HTML-Seiten, sondern eben die Fragmente, die du ja auch zu einer fertigen Seite zusammensetzen willst. Heißen nur halt nicht ".inc", sondern ".html".
Das Seitenauslieferungsskript hat dann die Aufgabe, die angeforderte URL auseinanderzunehmen und einfach die richtigen Fragmente zusammenzusetzen. Die angeforderte URL steht (das macht mod_rewrite, wenn es eingeschaltet ist) in $_SERVER['SCRIPT_URL'] drin. Diese Variable kannst du jetzt natürlich entweder auseinandernehmen, oder auch direkt einsetzen. Es empfiehlt sich vielleicht, zu prüfen, ob die URL gewissen strengeren Anforderungen genügt.
Aber man muß sich an dieser Stelle keinerlei Sorgen mehr machen, dass irgendwelche Dateien außerhalb des DOCUMENT_ROOT oder nichtexistierende Dateien aus Versehen eingebunden werden. Diese Prüfung erledigt mod_rewrite schon. Wenn es eine Datei nicht gibt, reagiert der Webserver, ganz ohne PHP anschmeißen zu müssen, mit einem 404 (den man natürlich mit eigener Fehlermeldung versehen kann). Und Zugriffe außerhalb des DOCUMENT_ROOT sind auch keine möglich, auch nicht mit "/../../.."-Zugriffsversuchen.
Ich hoffe, mein Prinzip ist dir klargeworden. :) Würde mich freuen, wenn es Sinn macht und übernommen würde.
- Sven Rautenberg
Die SelfHTML-Developer sagen Dankeschön für aktuell 21205,05 Euro Spendengelder!