Rolf B: Wie rufe ich mit URL-Parametern dynamisch Inhalte auf?

Beitrag lesen

problematische Seite

Hallo borisbaer,

was jetzt genau? Die Verarbeitung des Parameters in index.php hast Du doch schon in deiner Demoseite drin.

Die mod_rewrite-Konfiguration in der .htaccess? Letztlich definierst Du da, dass eine hereinkommende URL x/y/z irgendwie umgebaut werden soll, bevor der Server sie verarbeitet. Der Servername ist nicht mehr Teil dieser URL.

In deinen /games Ordner kannst Du eine .htaccess Datei stellen, die so aussieht:

RewriteEngine On
RewriteRule suchmuster ersetzungsmuster flags

Das Suchmuster ist eine Regex, mit der auf die URL gematcht wird, und zwar ab dem Ordner, in dem die .htaccess Datei steht. Also: Wenn die .htaccess im /games Ordner steht und die URL /games/demons-souls/mods abgerufen wird, wird die Regex auf demons-souls/mods angewendet.

Man kann mehrere RewriteRules angeben, und sie werden von oben nach unten verarbeitet. Wenn Du meinst, dass eine Rule die URL abschließend verarbeitet, gibt ihr das L Flag ("Last"), dann werden die folgenden Rules nicht mehr verarbeitet. Man kann auch so eine Art von IF-Blöcken bauen, das geht mit RewriteCond, aber das lass ich jetzt mal weg.

Wenn Du dies hier schreibst:

RewriteRule ^([^/]*)/([^/]*)$ $1/index.php?tab=$2 [L,QSA]

dann würden alle URLs nach dem Muster /games/spiel/tabname aufgebaut sind, als /games/spiel/index.php?tab=tabname verarbeitet. Alle anderen URLs bleiben unverändert.

Wieso ist das so? Schauen wir uns das Suchmuster an. Es sieht wüst aus:

^([^/]+)/([^/]+)$

Ich schiebe es mal etwas auseinander.

^  ([^/]+)  /  ([^/]+)  $

Regexe sind eine Nichtwissenschaft für sich. Wären sie eine Wissenschaft, gäbe es bspw. diese Mehrdeutigkeit des ^ Zeichens nicht.

Der Begriff "games" taucht im Suchmuster nicht auf. Siehe oben, dieser Teil der URL kommt beim Suchmuster gar nicht an.

Das erste ^ ist ein Anker. Steht es am Anfang der Regex, verankert es die Suche am Beginn des zu durchsuchenden Strings. Die Regex "ha" würde zwei Treffer in "haha" finden, aber "^ha" nur das erste ha.

Dann kommt eine Suche nach einer Folge von Zeichen. Dazu wird eine Klasse von Zeichen verwendet, das macht man mit den eckigen Klammern. Innerhalb der Klammern kann man verschiedenes angeben, z.B. [aeiou] für die Standardvokale. Man kann es aber auch andersrum sagen: Alles außer diesem hier, dafür verwendet man - blöderweise - das ^ Zeichen. [^aeiou] findet alles außer Vokalen, und [^/] heißt: Jedes Zeichen, das nicht / ist. Hinter dieser Zeichenklasse steht ein Plus. Das ist eine Wiederholungsangabe und bedeutet: Das, was links vom Plus ist, soll im duchsuchten String einmal bis beliebig oft vorkommen. [^/]+ findet also die Teile einer URL zwischen den / Zeichen.

Dieses Teilmuster ist in Klammern gesetzt und bildet damit eine Gruppe. Die brauchen wir nachher beim Ersetzen, denn den Inhalt einer gefundenen Gruppe kann man im Ersetzungsmuster einfügen.

Es folgt ein / - das ist ein Zeichen ohne Sonderbedeutung und verlangt an dieser Stelle einfach ein /.

Dahinter wird ein weiterer Pfadanteil in einer Gruppe abgefragt und zum Schluss kommt das $. Das $ ist wieder ein Anker, diesmal für das Ende der Zeichenkette.

Damit passt das Muster auf foo/bar oder f/b, nicht aber auf f oder foo/bar/baz. Diese blieben unverändert. Ein Abruf von /games/demons würde damit funktionieren wie bisher, und /games/demons/versus/zombies würde wohl auf HTTP Status 404 laufen. Wenn Du solche URLs an dein index.php übergeben willst, verwende als Suchmuster ^([^/]*)/(.*) - das .* am Ende sagt: Nimm Alles Was Kommt.

Nun zum Ersetzungsmuster. Da steht $1/index.php?tab=$2. Das kannst Du sicherlich selbst einordnen. $1 und $2 sind die Inhalte der Gruppen 1 und 2 aus dem Suchmuster, d.h. der Spielname und der Tabname.

Zum Schluss folgt noch [L,QSA]. Das sind Flags für die RewriteRule. L heißt "Last", d.h. wenn das Suchmuster zutrifft, ist dies die letzte verarbeitete Rewrite-Regel. QSA heißt "Query String Append" - ob Du das brauchst, weiß ich nicht. Was ist mit einer URL wie /games/demons/achievements?mode=3 - das wäre der Wunsch für das Spiel demons das tab achievements zu sehen, und bei diesem Abruf noch einen zusätzlichen URL-Parameter mode=3 zu nutzen. Ohne QSA würde dieser Extraparameter verloren gehen. Mit QSA würde er an deine generierte URL angehängt.

Ich hoffe, das war verständlich und auch das, was Du wissen wolltest.

Rolf

--
sumpsi - posui - obstruxi
0 75

Wie rufe ich mit URL-Parametern dynamisch Inhalte auf?

borisbaer
  • url
  1. 0
    TS
    • ajax
    • client-server
    • url
    1. 0
      borisbaer
  2. 0
    dedlfix
    1. 0
      borisbaer
      1. 0
        Samuel fiedler
        • javascript
        • php
        • url
        1. 0
          Der Martin
          • php
          • url
        2. 0
          Rolf B
          1. 0
            borisbaer
            1. 0
              Rolf B
              1. 0
                borisbaer
                1. 0
                  Rolf B
                  1. 0
                    borisbaer
                    1. 0
                      Rolf B
                      1. 0
                        borisbaer
                        1. 0
                          tk
                          • php
                          • url
                          1. 0
                            borisbaer
                        2. 0
                          Rolf B
                          1. 0
                            borisbaer
                            1. 0
                              Rolf B
                      2. 1
                        tk
                        • php
                        • url
                        1. 0
                          Rolf B
                          1. 0
                            borisbaer
                            1. 0
                              Der Martin
                              1. 0
                                Rolf B
                                1. 0
                                  borisbaer
                                  1. 0
                                    Rolf B
                                    1. 0
                                      borisbaer
                                      1. 0
                                        Rolf B
                                        1. 0
                                          borisbaer
                                          1. 0
                                            Rolf B
                                            1. 0
                                              borisbaer
                                            2. 0
                                              borisbaer
                                              1. 0
                                                Rolf B
                                                1. 0
                                                  borisbaer
                                                  1. 0
                                                    Rolf B
                                                    1. 0
                                                      borisbaer
                                                      1. 0
                                                        Rolf B
                                                        1. 0
                                                          borisbaer
                                                          1. 0
                                                            borisbaer
                                                            1. 0
                                                              Rolf B
                                                              1. 0
                                                                borisbaer
                                                                1. 0
                                                                  Rolf B
                                                                  1. 0
                                                                    borisbaer
                                                            2. 0
                                                              Rolf B
                                                              1. 0
                                                                borisbaer
                                                                1. 0
                                                                  Rolf B
                                                                  1. 0
                                                                    borisbaer
                                                                    1. 0
                                                                      Rolf B
                                                                      1. 0
                                                                        borisbaer
                                                                        1. 0
                                                                          Rolf B
                                                                          1. 0
                                                                            klawischnigg
                                                                            1. 0
                                                                              Rolf B
                                                                              1. 0
                                                                                klawischnigg
                                                                                1. 0
                                                                                  Rolf B
                                                                          2. 1
                                                                            borisbaer
                                2. 0
                                  Der Martin
                                  1. 0
                                    Rolf B
                                    1. 0
                                      Der Martin
                                      1. 0
                                        Rolf B
                                        1. 0
                                          Der Martin
                                          1. 0
                                            Rolf B
                            2. 0
                              Tabellenkalk
                              1. 0
                                borisbaer
        3. 0
          borisbaer
  3. 0
    Rolf B
    1. 0
      borisbaer
      1. 0
        Rolf B
        1. 0
          borisbaer
          1. 0
            Rolf B
            1. 0
              borisbaer
              1. 1
                Rolf B
                1. 0
                  borisbaer
                  1. 0
                    Rolf B
                    1. 0
                      borisbaer