it-swarm.com.de

Wie kann man benutzerfreundliche Pfade in PHP implementieren, ohne für jede Seite eine Datei oder ein Verzeichnis zu erstellen?

HINWEIS: Meine Terminologie ist möglicherweise nicht ganz korrekt. Ich glaube, StackExchange macht so etwas wie das, was ich frage, falls dies die Dinge klarer machen kann.

Mit PHP auf Apache möchte ich URLs wie:

http://www.site.com/info/<brand>/<model>/<page>

Zum Beispiel mit <brand> = toyota, <model> = camry, <page> = 'safety'

Und lassen Sie alle URLs, die mit 'info' beginnen (sagen wir mal), von einer einzelnen PHP -Datei wie 'info.php', ohne dass sich die URL in der Adressleiste ändert behandeln.

Mit anderen Worten, jemand navigiert zu:

http://www.site.com/info/toyota/camry/safety

Der Code dafür ist jedoch in info.php enthalten, die URL im Browser bleibt jedoch unverändert. Ich möchte nicht die gesamte Verzeichnisstruktur/toyota/camera/safety erstellen müssen (es gäbe 1000s).

Ich vermute, dass info.php die Pfadkomponenten als Parameter abrufen würde, um zu wissen, welche Inhalte bereitgestellt werden sollen. Der interne Aufruf, der für den Benutzer unsichtbar ist, wäre also:

info.php?brand=toyota&model=camera&page=safety

Die Frage hier scheint etwas Ähnliches zu tun, da sie URLs wie die folgenden erhalten:

http://webmasters.stackexchange.com/questions/13978/how-to-implement-user-friendly-paths-in-php-without-creating-a-file-or-directory

und ich nehme an, dass der Pfad dort nicht tatsächlich auf dem Server angelegt ist.

3
Itai

Da Sie Apache verwenden, möchten Sie mod_rewrite , das normalerweise standardmäßig verfügbar ist. Mit mod_rewrite können Sie eingehende Anforderungen umschreiben . Es kann Unteranforderungen stellen, die aktuelle Anforderung ändern oder den Benutzer sogar an eine andere Stelle umleiten. Es ist ein außergewöhnlich leistungsfähiges Tool mit einer Syntax, die manchmal etwas stumpf sein kann.

Sie möchten RewriteRules einrichten . RewriteRules verwenden die PCRE-Bibliothek für reguläre Ausdrücke. Wenn Sie also reguläre Ausdrücke in Perl oder die Funktionsfamilie preg in PHP verwendet haben, sollten Sie mit der Syntax vertraut sein.

Es gibt zwei gebräuchliche Muster, wenn hübsche URLs mit mod_rewrite und PHP erstellt werden. Im ersten Schritt wählen Sie einen "Einhängepunkt" aus, unter dem alle hübschen URLs gespeichert werden, und rufen stattdessen ein PHP -Skript auf, das den Rest des Pfads nach dem Einhängepunkt enthält. Beispielsweise könnte ein Aufruf von /info/toyota/camry/saftey in /info.php/toyota/camry/saftey umgeschrieben werden.

Das Skript PHP greift dann auf $_SERVER['PATH_INFO'] zu, das /toyota/camry/saftey enthält, und verarbeitet diesen Wert nach Bedarf. Ja, das wird völlig funktionieren. Probieren Sie es selbst mit einem phpinfo Skript aus. Sie finden die Bits nach der Dateierweiterung in PATH_INFO.

Hier ist ein ungetestetes, aber wahrscheinlich funktionierendes Beispiel:

# ask mod_rewrite to turn itself on
    RewriteEngine On
# If the request is not for an actual file, then...
    RewriteCond %{REQUEST_FILENAME} !-f
# ... capture the part of the path after /info/ and replace it 
# with a call to the PHP script.  In the regex, .+ means "Any 
# character, one or more times"
    RewriteRule ^/info/(.+)$ /info.php/$1

Das zweite Muster besteht darin, eine Umschreiberegel einzurichten, um Teile des Pfades tatsächlich zu extrahieren und in eine einfache alte reguläre Abfragezeichenfolge umzuwandeln. Dies ist am besten, wenn Sie ein vorhandenes Skript haben und keine Änderungen daran vornehmen möchten. Dies kann auch komplexer sein, da Sie pro Satz von Kandidaten-URLs eine Regel schreiben müssen.

Hier ist ein weiteres ungetestetes, aber wahrscheinlich funktionierendes Beispiel.

# /info/foo => info.php?brand=foo
# [^/]+ means "Any character that is not a /, one or more times
    RewriteRule ^/info/([^/]+)$ /info.php?brand=$1
# /info/foo/bar => info.php?brand=foo&model=bar
    RewriteRule ^/info/([^/]+)/([^/]+)$ /info.php?brand=$1&model=$2
# /info/foo/bar/baz => info.php?brand=foo&model=bar&page=baz
    RewriteRule ^/info/([^/]+)/([^/]+)/([^/]+)$ /info.php?brand=$1&model=$2&page=$3

Dies ist nur ein Tipp des Mod_rewrite iceburg. Es gibt viele, viele, viele Tutorials und Anleitungen, die Ihnen weiterhelfen können.

4
Charles