Wir setzen unsere Überprüfung der htaccess-Dateien fort und untersuchen heute, wie Sie mod_rewrite verwenden, um hübsche URLs zu erstellen.
Während einige behaupten, dass hübsche URLs in Suchmaschinen-Rankings hilfreich sind, ist die Debatte hier heftig. Wir sind uns alle einig, dass hübsche URLs unseren Benutzern die Sache erleichtern und jeder Webanwendung einen Grad an Professionalität und Klarheit verleihen. Ich könnte alle theoretischen Gründe dafür besprechen, aber ich mag realere Beispiele besser. Wie es ist oder ob wir es hassen, müssen wir alle zugeben, dass Twitter eine sehr beliebte Webanwendung ist und ein Teil des Grunds dafür ist, wie es URLs formatiert. Ich kann jedem sagen, dass mein Twitter-Benutzername noahhendrix ist, und er weiß, dass mein Profil leicht unter twitter.com/noahhendrix zu finden ist. Dieses scheinbar einfache Konzept hat große Auswirkungen auf die Beliebtheit Ihrer Anwendung.
Um die Dinge in die richtige Perspektive zu rücken, können wir uns eine andere beliebte Social-Networking-Website, Facebook, anschauen. Seit dem Start der Website im Jahr 2004 ist das Profilsystem gewachsen und hat sich weiterentwickelt, um besser auf die Benutzer zugeschnitten zu sein. Ein eklatantes Loch war jedoch die URL eines Profils. Seit der Registrierung bei Facebook war mein Profil unter der URL http://www.facebook.com/profile.php?id=1304880680 zu finden. Das ist ein ziemlicher Mund, und erst kürzlich hat Facebook den Eindruck gewonnen, dass Facebook-Eitelkeits-URLs gestartet wurden. Jetzt kann ich mein Facebook-Profil teilen, indem ich den Benutzern mitteilt, dass mein Facebook-Benutzername "noahhendrix" ist. Sie können sie unter facebook.com/noahhendrix finden. Die Wahrscheinlichkeit ist groß, dass wir keine so beliebte Anwendung wie Facebook haben, aber wir können uns trotzdem ein paar Seiten aus ihrem Buch leihen.
Um einen kurzen Überblick zu geben, bevor wir uns mit Code beschäftigen, werden wir im heutigen Tutorial zwei etwas unterschiedliche Methoden zum Erstellen hübscher URLs mit HTACCESS durchgehen. Der Unterschied zwischen den Methoden besteht darin, ob Apache oder PHP die schwere Aufgabe ausführen, um die URL für die Analyse aufzuteilen. Ich möchte darauf hinweisen, dass Mod_rewrite-Tutorials fast so alt sind wie das Internet selbst und dies ist nicht das erste. Am Ende werde ich eine der Methoden verwenden, um eine einfache Anwendung zu erstellen, um zu zeigen, wie diese Lösungen auf einer echten Website aussehen würden (naja, nicht 100% ige Produktionsqualität). Der Dienst, den wir erstellen werden, ist ein URL-Shortener, der die Funktionalität solcher Websites wie bit.ly, TinyURL oder su.pr. widerspiegeln kann. Lassen Sie uns also ohne Flusen den Code betrachten.
Erstens können wir unseren gesamten Code in Apache-.htaccess-Dateien platzieren. Das könnte ungefähr so aussehen:
Optionen + FollowSymLinks RewriteEngine On RewriteCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^ Benutzer / (\ d +) * $ ./profile.php?id=$1 (+) ./thread.php?id=$1 RewriteRule ^ search /(.*)$ ./search.php?query=$1
Beginnen wir oben und arbeiten wir nach unten, um besser zu verstehen, was hier vor sich geht. In der ersten Zeile wird die Umgebung so eingestellt, dass sie symbolischen Links mithilfe der Options-Direktive folgt. Dies kann erforderlich sein oder auch nicht, aber einige Web-Hosts verwenden für häufig auftretende HTTP-Anforderungsfehler Symlinks (ähnlich wie Alias in MacOSX oder Windows-Verknüpfungen), und dies sind in der Regel Symlink-Dateien, oder zumindest verstehe ich die Gründe dafür. Als Nächstes sagen wir Apache, dass wir die Rewrite Engine verwenden werden. Die nächsten beiden Zeilen sind sehr, sehr wichtig, da das Umschreiben von URLs nur auf Pfade beschränkt ist, die nicht wirklich vorhanden sind. Dies verhindert, dass die folgenden Regeln übereinstimmen example.com/images/logo.png zum Beispiel. Die erste verhindert vorhandene Verzeichnisse mit der !-d Flagge und die zweite mit !-f bedeutet, vorhandene Dateien zu ignorieren.
Die nächsten drei Zeilen enthalten die eigentlichen URL-Schreibbefehle. Jede Zeile erstellt eine Regel, die versucht, ein Muster regulärer Ausdrücke mit der eingehenden URL abzugleichen. Reguläre Ausdrücke, zumindest für mich, sind schwer zu merken, aber ich finde es immer hilfreich, dieses Tutorial von Nettuts eigenem Jeffery Way und dem von ihm empfohlenen Werkzeug zu verwenden. Ich fand es einfach, Beispiel-URLs einzugeben, die wir zuordnen möchten, und dann zu versuchen, das Muster zusammen zu hacken.
Das erste Argument ist das Muster zwischen Einfügemarke und Dollarzeichen. Wir teilen Apache mit, dass URLs nach dem Benutzerverzeichnis gefragt werden sollen (ein künstliches Verzeichnis muss nicht vorhanden sein), gefolgt von einer / und einer beliebigen Länge von Zahlen. Die Klammern erstellen eine Capture-Gruppe. Sie können beliebig viele davon verwenden. Sie dienen als Variablen, die wir dann in unsere Umschreibung übertragen können. Das Sternchen bedeutet, dass der Benutzer alles eingeben kann, was er will, und das Umschreiben wird nicht beeinflusst. Dies ist in erster Linie dazu gedacht, einen nachstehenden Schrägstrich so zu behandeln example.com/users/123 ist das gleiche wie example.com/users/123/ wie die Benutzer erwarten würden.
Das zweite Argument ist der Pfad, den wir tatsächlich aufrufen möchten. Im Gegensatz zum ersten muss es sich um eine echte Datei handeln. Wir weisen Apache an, im aktuellen Verzeichnis nach einer Datei zu suchen profile.php und senden Sie den Parameter id = $ 1 zusammen damit. Erinnern Sie sich an die Capture-Gruppe früher? Hier bekommen wir die Variable $ 1, Capture-Gruppen beginnen bei eins. Dadurch wird eine URL auf dem Server erstellt example.com/profile.php?id=123.
Diese Methode eignet sich hervorragend für ältere Webanwendungen, die über vorhandene URL-Strukturen verfügen, sodass wir das Backend nicht leicht neu schreiben können, um ein neues URL-Schema zu verstehen, da die URL für den Server gleich aussieht, für den Benutzer jedoch wesentlich angenehmer.
Diese nächste Methode ist ideal für diejenigen, die nicht zu viel Logik an Apache verteilen möchten und sich in PHP (oder ähnlichen Skriptsprachen) wohler fühlen. Das Konzept hier ist, jede URL, die der Server empfängt, zu erfassen und auf eine PHP-Controller-Seite zu verschieben. Dies bringt den zusätzlichen Vorteil der Kontrolle mit sich, erhöht aber gleichzeitig die Komplexität. Ihre HTACCESS-Datei könnte in etwa so aussehen:
Optionen + FollowSymLinks RewriteEngine On RewriteCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^. * $ ./Index.php
Alles ist wie oben, bis auf die letzte Zeile, also werden wir darauf springen. Anstatt eine Capture-Gruppe zu erstellen, weisen wir Apache an, jede URL zu packen und an diese weiterzuleiten index.php. Dies bedeutet, dass wir unsere gesamte URL-Verarbeitung in PHP erledigen können, ohne sich zu sehr auf stringente URL-Pfade in HTACCESS zu verlassen. Das könnten wir oben in unserer index.php-Datei tun, um die URL herauszufinden:
Die erste Zeile ist nicht erforderlich, es sei denn, Ihre Anwendung befindet sich nicht im Stammverzeichnis, wie bei meinen Demos. Ich entferne den unsinnigen Teil der URL, um den sich PHP nicht sorgen sollte. $ _SERVER ['REQUEST_URI'] ist eine globale Servervariable, die von PHP von der Anforderungs-URL bereitgestellt und gespeichert wird. Sie sieht im Allgemeinen so aus:
/ envato / pretty / php / users / abfrage
Wie Sie sehen, ist es im Wesentlichen alles nach dem Domainnamen. Als nächstes teilen wir den verbleibenden Teil des virtuellen Pfads auf und teilen ihn durch den / Dies erlaubt uns, einzelne Variablen zu erfassen. In meinem Beispiel habe ich gerade die $ params Array out in the body, natürlich möchten Sie etwas nützlicheres tun.
Eine Sache, die Sie tun könnten, ist das erste Element der $ params array und füge eine Datei mit demselben Namen ein und innerhalb der Datei kannst du das zweite Element des Arrays verwenden, um Code auszuführen. Das könnte ungefähr so aussehen:
WARNUNG: Der erste Teil dieses Codes ist unglaublich wichtig! Sie müssen unbedingt einschränken, welche Seiten ein Benutzer erhalten kann, damit er nicht die Möglichkeit hat, die gewünschte Seite auszudrucken, indem er die Dateinamen wie eine Datenbankkonfigurationsdatei erraten.
Nun, da wir die Seifenkiste aus dem Weg haben, gehen wir weiter. Als nächstes prüfen wir, ob sich die angeforderte Datei im Ordner befindet $ safe_pages Array, und wenn wir es sonst einschließen, wird eine 404-Seite nicht gefunden. Auf der mitgelieferten Seite sehen Sie, dass Sie Zugriff auf die haben $ params Array und Sie können alle Daten daraus entnehmen, die in Ihrer Anwendung erforderlich sind.
Dies ist ideal für diejenigen, die mehr Kontrolle und Flexibilität wünschen. Offensichtlich ist etwas mehr Code erforderlich, daher ist es wahrscheinlich besser für neue Projekte, bei denen nicht viel Code für die neuen URL-Formate aktualisiert werden muss.
Dieser letzte Teil des Tutorials wird uns den oben genannten Code etwas näher bringen und ist mehr oder weniger ein "reales" Beispiel. Wir werden einen Dienst namens erstellen shrtr, Ich habe diesen Namen gemacht, sodass alle anderen Produkte mit diesem Namen nicht mit dem Code verbunden sind, den ich hier posten. HinweisIch weiß, dass dies bei weitem kein originelles Konzept ist und nur zur Demonstration gedacht ist mod_rewrite. Zuerst werfen wir einen Blick auf die Datenbank:
Wie Sie sehen, ist das sehr einfach, wir haben nur 4 Spalten:
Als nächstes gehen wir die sechs Dateien durch, die wir für diese Anwendung erstellen müssen:
Das ist alles, was wir für unser grundlegendes Beispiel brauchen. Ich werde nicht abdecken index.php oder css / style.css sehr detailliert, da sie kein PHP haben und statische Dateien sind.
# index.php ----Erstellt URLs Shrtr shrtr.mir
Das einzig wirklich Interessante dabei ist, dass wir das Formular mit einem Feld namens URL senden create.php.
# css / style.css ---- / * reset * / * font-family: Helvetica, serifenlos; Marge: 0; Polsterung: 0; / * site * / html, body Hintergrundfarbe: # 008AB8; a color: dunkelblau; Textdekoration: keine; #pagewrap margin: 0 auto; Breite: 405px; h1 Farbe: weiß; Marge: 0; Text ausrichten: Mitte; Schriftgröße: 100px; h1 .r color: dunkelblau; .body -moz-border-radius: 10px; -webkit-border-radius: 10px; Hintergrundfarbe: weiß; Text ausrichten: Mitte; Polsterung: 50px; Höhe: 80px; Position: relativ; .body .instructions display: block; Rand unten: 10px; .body .back right: 15px; oben: 10px; Position: absolut; .body Eingabe [Typ = Text] Anzeige: Block; Schriftgröße: 20px; Rand unten: 5px; Text ausrichten: Mitte; Polsterung: 5px; Höhe: 20px; Breite: 300px;
Das ist alles sehr generisch, macht aber unsere Anwendung etwas vorzeigbarer.
Die letzte grundlegende Datei, die wir betrachten müssen, ist unsere db_config.php, Ich habe dies erstellt, um einige der Datenbankverbindungsinformationen zu abstrahieren.
# db_config.php ----
Sie müssen die Werte durch das ersetzen, was in Ihrer Datenbank funktioniert. Der Host ist wahrscheinlich localhost, Sie müssen sich jedoch bei Ihrem Hosting-Anbieter noch einmal erkundigen. Hier ist der SQL-Dump der Tabelle, url_redirects das enthält alle Informationen, die wir oben gezeigt haben:
-- -- Tabellenstruktur für die Tabelle 'url_redirects' - CREATE TABLE WENN NOT EXISTS 'url_redirects' ('id' int (11) NOT NULL auto_increment, 'short' varchar (10) NOT NULL, 'url' varchar (255) NOT NULL, ' created_at 'timestamp NOT NULL default CURRENT_TIMESTAMP, PRIMARY KEY (' id '), KEY' short '(' short ')) ENGINE = MyISAM DEFAULT CHARSET = utf8;
Als Nächstes sehen wir uns den Code an, der zum Erstellen unserer kurzen URL erforderlich ist.
# create.php ---- shrtr.me/".$short; else $ html = "Fehler: Datenbank kann nicht gefunden werden"; mysql_close ($ db);?>Erstellt URLs Shrtr shrtr.mir
= $html ?>
X
Jetzt werden wir etwas komplexer! Zuerst müssen wir die zuvor erstellten Datenbankverbindungsvariablen einschließen. Dann speichern wir den URL-Parameter, den das Erstellungsformular an uns sendet, in einer Variablen, die aufgerufen wird $ url. Als Nächstes führen wir einige reguläre Ausdrücke durch, um zu prüfen, ob sie tatsächlich eine URL gesendet haben. Wenn nicht, speichern wir einen Fehler. Wenn der Benutzer eine gültige URL eingegeben hat, wird eine Verbindung zur Datenbank hergestellt, wobei die Verbindungsvariablen verwendet werden, die wir oben auf der Seite enthalten. Als Nächstes generieren wir mit der Funktion substr eine zufällige Zeichenfolge mit 5 Zeichen, die in der Datenbank gespeichert werden soll. Die Zeichenfolge, die wir aufteilen, ist der MD5-Hash der aktuellen Zeit () und $ url miteinander verkettet. Dann fügen wir diesen Wert in das ein url_redirects zusammen mit der tatsächlichen URL und speichern Sie eine Zeichenfolge, die dem Benutzer angezeigt werden soll. Wenn die Daten nicht eingefügt werden, wird ein Fehler gespeichert. Wenn Sie sich in den HTML-Teil der Seite bewegen, drucken wir nur den Wert von aus $ html, sei es ein fehler oder ein erfolg. Dies ist offensichtlich nicht die eleganteste Lösung, aber es funktioniert!
Wir haben also die URL in der Datenbank, an der wir arbeiten dienen.php So können wir den Kurzcode tatsächlich in eine Weiterleitung übersetzen.
Erstellt URLs Shrtr shrtr.mir
= $html ?>
X
Dieser ist sehr ähnlich create.php Wir fügen die Datenbankinformationen hinzu und speichern den an uns gesendeten Funktionscode in einer aufgerufenen Variablen $ kurz. Als nächstes fragen wir die Datenbank nach der URL dieses Funktionscodes ab. Wenn wir ein Ergebnis erhalten, leiten wir zur URL weiter, wenn nicht, drucken wir einen Fehler wie zuvor aus.
Was PHP betrifft, ist dies alles, was wir tun müssen, aber um eine kurze URL mitzuteilen, müssen Benutzer dies eingeben, http://shrtr.me/server.php?short=SHORT_CODE nicht sehr hübsch ist es? Mal sehen, ob wir Mod_rewrite-Code nicht integrieren können, um das besser zu machen.
Von den beiden Methoden, über die ich zu Beginn des Tutorials geschrieben habe, werden wir die Apache-Methode verwenden, da diese Anwendung bereits erstellt wurde, ohne dass eine URL-Analyse in Betracht gezogen wird. Der Code sieht ungefähr so aus:
Optionen + FollowSymLinks RewriteEngine On RewriteCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^ (\ w +) $ ./serve.php?short=$1
Beim Überspringen zur RewriteRule lenken wir jeden Datenverkehr, für den es noch keine echten Dateien oder Verzeichnisse gibt dienen.php und setzen Sie die Erweiterung in die Variable GET kurz. Nicht schlecht, probieren Sie es einfach selbst aus!
Heute haben wir einige Möglichkeiten kennen gelernt, mod_rewrite in unserer Anwendung zu verwenden, um unsere URLs hübsch zu gestalten. Wie immer werde ich auf die Kommentare achten, wenn jemand Probleme hat oder Sie können mich auf Twitter kontaktieren. Danke fürs Lesen!