Wie entferne ich nachgestellte Schrägstriche mit .htaccess von der URL?

8

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:

  • /und index.php-> mydomain.com(buchstäblich nur der bloße Domainname).

  • /account.phpoder /account/oder /account->mydomain.com/account

  • /account/subscriptions.phpoder /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:

  1. Externe 301-Weiterleitung ( mydomain.com/account/-> mydomain.com/account)
  2. 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).

Matt
quelle
Wie würden Sie zwischen account.php und einem Konto / Ordner unterscheiden? Dafür ist der nachgestellte Schrägstrich gedacht.
Kevin C.
Gute Frage. Sie sind das gleiche. Der Ordner "account" wird in "account.php" umgeschrieben. (Sie finden diese Struktur häufig in Visual Studio-Webprojekten.)
Matt
Huh? Es tut mir leid, das ergibt für mich keinen Sinn. Wenn es eine /account.php-Datei und eine /account/index.php-Datei gibt (auf die normalerweise einfach mit / account / zugegriffen wird), wie unterscheiden Sie die beiden? In einem Dateisystem sind sie nicht dasselbe. Wenn Sie alles über einen einzelnen index.php-Ordner booten, wie es PHP-Frameworks tun, ist dies möglicherweise sinnvoll. Meinst Du das?
Kevin C.
Entschuldigung, ich hätte klarer sein sollen. Wir werden keine Indexdateien verwenden (außer der Homepage; aber machen Sie sich bei dieser Frage keine Sorgen). Alle Dateinamen beschreiben ihren Inhalt. Dies bedeutet zum Beispiel, dass /account/neu geschrieben /accountund tatsächlich geliefert wird /account.php, nicht /account/index.php .
Matt

Antworten:

8

Vielen Dank, dass Sie sich die Frage angesehen haben, aber wir haben es anscheinend herausgefunden:

Options -Multiviews -Indexes +FollowSymLinks
RewriteEngine On
RewriteBase /
DirectorySlash Off

# remove trailing slash
RewriteRule ^(.*)\/(\?.*)?$ $1$2 [R=301,L]

# rewrite /dir/file?query to /dir/file.php?query
RewriteRule ^([\w\/-]+)(\?.*)?$ $1.php$2 [L,T=application/x-httpd-php]

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):

location = / {
    index index.html;
}

try_files $uri $uri.html =404;

Wir haben auch von PHP auf einfaches HTML umgestellt, aber das Ändern der obigen Erweiterungen sollte, wenn überhaupt, kaum einen Unterschied machen.

Matt
quelle
Im Nachhinein haben wir zu Nginx gewechselt und diese ganze Aufgabe war SUPER einfach ...
Matt
Kleiner Punkt, aber Sie müssen dem Schrägstrich ( /) in der Regex nicht entkommen , da er keine besondere Bedeutung hat. \/ist das gleiche wie '/'.
MrWhite
@ w3d Guter Punkt. Das ist eine Gewohnheit von meiner Javascript-Regex'ing.
Matt
0

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:

RewriteRule ^/account/$ /account
RewriteRule ^/account$ /account.php [R,L]

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.

jcisio
quelle
1
Theoretisch ist das die allgemeine Idee (außer wir möchten .php nicht im Browser anzeigen), aber das würde nur für account.php funktionieren. Wir hoffen auf eine allgemeine Lösung, die auf der gesamten Website funktioniert. Mit refiddle zum Testen unserer regulären Ausdrücke wissen wir , dass reguläre Ausdrücke ^(.*)/$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.
Matt
0

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.

Kevin C.
quelle
Wir haben über so etwas nachgedacht (danke für die Links), aber unsere Entwicklungsversion der Site ist PHP-basiert und die bereitgestellte Produktionssite ist 100% statisch (kein PHP). Diese .htaccess-Datei befindet sich vor dem bereitgestellten Produktionsstandort.
Matt
Es wäre sehr einfach, schnell eine statische Site basierend auf diesen Mikro-Frameworks zu erstellen. Das Projekt, für das ich sie verwendet habe, bestand hauptsächlich aus statischen Inhalten, wobei nur ein Spritzer PHP verwendet wurde, um die Site mithilfe des Micro-Frameworks zu booten. Abhängig von der Größe der Site kann die Konvertierung in ein Micro-Framework schneller sein, als den ganzen Tag gegen .htaccess zu stoßen.
Kevin C.