Sven Rautenberg: mod rewrite - bin am verzweifeln

Beitrag lesen

Moin!

Aber anscheinend versteh ich die ganze Sache nicht richtig.
Jetzt, wo die Sache zumindest dann geht, wenn zwei Parameter übergeben werden, sehe ich, dass ALLE anderen Links auf der Seite in das Format

www.XXX.de/neuigkeiten/123/neuigkeiten.php?id=1420&idx=1

gewandelt werden.

Dies will ich ja nun auch wieder nicht... Warum wird jetzt immer das "neuigkeiten/123/" vor die Links gesetzt?

Rewriting greift nur in einer Richtung. Nämlich beim Umwandeln einer URL in eine Dateiangabe.

Stell dir vor, auf irgendeiner Webseite, z.B. ein Google-Suchergebnis, ist eine URL auf deinem Server zu sehen:

http://www.example.org/neuigkeiten/123

Diese URL ruft jemand im Browser auf. Dadurch kommt die URL in die Adresszeile, und dein Server kriegt einen Request nach "/neuigkeiten/123".

Jetzt kommt das Rewriting und sieht, dass diese URL auf deine RewriteRule passt. Das Ziel ist dann eine URL namens "/neuigkeiten.php?id=123"

Und dann kommt der Standard-Mechanismus von Apache, der dieses PHP-Skript startet, den Parameter übergibt, und das Ergebnis des Skripts dann an den Browser liefert. Fertig.

Der Punkt ist: Wenn dein Skript seinerseits einen Link auf eine andere Neuigkeit enthält, muss es diesen Link natürlich auch in der passenden URL-Form ausgeben! Da hilft dir aber das Rewriting nicht, dafür bist du selbst verantwortlich.

Nehmen wir mal an, deine Neuigkeiten-Seite 123 listet die aktuellsten 5 News mit den IDs 210 bis 214. Dann muss der Link, den du ins HTML schreibst, so lauten: <a href="/neuigkeiten/210">Titel</a>

Momentan schreibst du aber höchstwahrscheinlich: <a href="?id=210">Titel</a>, vielleicht auch <a href="neuigkeiten.php?id=210">Titel</a>

Das scheitert, bzw. liefert nicht das von dir gewünschte Ergebnis, denn der Browser ist ja weiterhin auf der URL "/neuigkeiten/123", und relativ zu dieser URL kommt jetzt dein Link ins Spiel:

"/neuigkeiten/123" plus "?id=210" ergibt "/neuigkeiten/123?id=210"
"/neuigkeiten/123" plus "neuigkeiten.php?id=210" ergibt "/neuigkeiten/neuigkeiten.php?id=210"

Das ist eine Sache, die sich halt komplett im Browser abspielt, weil der ausschließlich relative URLs zusammenaddiert.

Welchen Effekt es aufgrund deiner Rewrite-Rule nun hat, wenn man diese URL aufruft, wäre zu untersuchen. Wenn du für den zweiten Pfadteil explizit nach Ziffern suchst, wie in deinem Ausgangsposting angedeutet, dann wird diese RewriteRule bei dem zweiten Beispiel, das ich gegeben habe, nicht mehr zutreffen, weil der zweite Pfadteil ja "neuigkeiten.php" lautet und keinerlei Ziffern enthält. Folglich wird die RewriteRule nicht mehr ausgeführt. Und deshalb gibts 404, wenn keine weitere Rule dahinter doch noch zutrifft.

Und warum kommt ein 404, wenn nur ein Parameter übergeben wird? Kann man irgendwo sehen, was der Server da für ne Seite eigentlich ausliefern will, die er dann nicht finden kann?

Du kannst das RewriteLog anschalten versuchen, und dadurch sehen, was mod_rewrite so macht. Bringt aber eher nix, wenn du vorher nicht deine Linkausgabe so geändert hast, dass die von dir präferierten URLs auch tatsächlich an den Browser ausgegeben werden.

- Sven Rautenberg