Die Situation
In der gesamten Domain möchten wir, dass die URLs Dateierweiterungen ausblenden und nachgestellte Schrägstriche entfernen , unabhängig vom Domainnamen selbst (wie in, funktioniert in jeder Domain).
Beispiel unserer Verzeichnisstruktur
Wir verwenden keine Index. * -Dateien mit Ausnahme der Homepage.
- /.
- /index.php
- /account.php
- /Konto
- /subscriptions.php
- /login.php
- /Anmeldung
- /reset-password.php
Das Ziel
Einige Beispiele, wie diese Dateien angefordert werden könnten und wie sie im Browser aussehen sollten:
/
undindex.php
->mydomain.com
(buchstäblich nur der bloße Domainname)./account.php
oder/account/
oder/account
->mydomain.com/account
/account/subscriptions.php
oder/account/subscriptions/
oder/account/subscriptions
->mydomain.com/account/subscriptions
Wie Sie sehen können, gibt es mehrere Möglichkeiten, auf jede Webseite zuzugreifen. Unabhängig davon, auf welche der zwei oder drei Arten Sie dorthin gelangen, wird im Browser nur die eine bevorzugte URL angezeigt.
Die Frage
Wie geht das mit .htaccess mit mod_rewrite?
Ich habe meinen Kopf gegen die Wand geschlagen, um das herauszufinden, aber im Allgemeinen scheint der Umschreibungsfluss ungefähr so zu sein:
- Externe 301-Weiterleitung (
mydomain.com/account/
->mydomain.com/account
) - Fügen Sie intern .php hinzu (
mydomain.com/account
->mydomain.com/account.php
)
Ich habe den ganzen Tag gegoogelt, Tausende von Dokumentationszeilen und Konfigurationstexten gelesen und es mehrere Dutzend Mal versucht ... Ich denke, mehr Verstand würde viel helfen.
AKTUALISIEREN
Wir haben eine Antwort auf unsere Frage gefunden (siehe unten).
/account/
neu geschrieben/account
und tatsächlich geliefert wird/account.php
, nicht/account/index.php
.Antworten:
Vielen Dank, dass Sie sich die Frage angesehen haben, aber wir haben es anscheinend herausgefunden:
Wir müssen Multiviews und Indizes deaktivieren, damit die Engine nicht verwirrt wird. Versuchen Sie stattdessen, auf eine
index.*
Datei zu verweisen oder eine Verzeichnisliste anzuzeigen (mit Apache verwirrenderweise auch als "Index" bezeichnet ...), wenn ein Verzeichnis angefordert zu werden scheint.Die erste Umleitung sichtbar (
R=301
) entfernt den abschließenden Schrägstrich und die zweite umschreibt ihn intern in die vorliegende PHP-Datei (oder HTML-Datei usw.).Diese .htaccess-Datei unterstützt auch Abfragezeichenfolgen.
Update Wie bereits in den Kommentaren unten erwähnt, haben wir viel früher auf nginx umgestellt, und dies ist alles, was unsere conf-Datei im Zusammenhang mit dem Umschreiben von URLs enthält (aus meiner Entwicklungsbox):
Wir haben auch von PHP auf einfaches HTML umgestellt, aber das Ändern der obigen Erweiterungen sollte, wenn überhaupt, kaum einen Unterschied machen.
quelle
/
) in der Regex nicht entkommen , da er keine besondere Bedeutung hat.\/
ist das gleiche wie '/'.Warum möchten Sie / account nach /account.php umleiten? Tatsächlich existiert die Seite / das Konto nur bei der Inhaltsverhandlung . Wenn Sie es nicht wollen, deaktivieren Sie einfach die Direktive.
Über Ihre beiden Regeln halte ich es für unkompliziert:
Es ist jedoch ungetestet. Sie können auch
[R,L]
zur ersten Zeile hinzufügen. In diesem Fall führt der Browser eine weitere Weiterleitung durch.quelle
^(.*)/$
URLs mit einem abschließenden Schrägstrich anzeigen, aber dies scheint nur in Verzeichnissen der obersten Ebene und nicht in Unterverzeichnissen Auswirkungen zu haben. (Anforderungen an Unterverzeichnisse, die mit dem vollständigen Serverpfad in der URL neu geschrieben und aus irgendeinem Grund im Browser angezeigt werden.) Wir sind auch sicher, dass^(.*)[^/]$
eine URL ohne einen abschließenden Schrägstrich angegeben wird.Wenn Sie eine flexible und einfache Möglichkeit zum Weiterleiten von URL-Anfragen für Ihre Website oder App wünschen, würde ich ein PHP-Micro-Framework empfehlen. Sie haben nicht nur die vollständige Kontrolle über Ihr URL-Routing, sondern bieten auch andere Vorteile.
Ich habe zuvor das Slim Framework verwendet , kombiniert mit der Symfony Templating Component mit großartigen Ergebnissen. Wenn ich es noch einmal machen würde, würde ich wahrscheinlich nur das Silex Micro-Framework verwenden , da es auch Teil von Symfony Components ist.
quelle