it-swarm.com.de

Wie entferne ich abschließende Schrägstriche von der URL mit .htaccess?

Die Situation

Wir möchten, dass die URLs in der gesamten Domain die Dateierweiterungen verbergen und abschließende Schrägstriche entfernen, unabhängig vom Domainnamen (wie in, funktioniert auf 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.php oder /account/ oder /account -> mydomain.com/account

  • /account/subscriptions.php oder /account/subscriptions/ oder /account/subscriptions -> mydomain.com/account/subscriptions

Wie Sie sehen, 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 bevorzugte URL angezeigt.

Die Frage

Wie geht das mit .htaccess mit mod_rewrite?

Ich habe meinen Kopf gegen die Wand gestoßen, um das herauszufinden, aber im Allgemeinen scheint der Umschreibefluss ungefähr so ​​zu sein:

  1. Externe 301-Umleitung (mydomain.com/account/ -> mydomain.com/account)
  2. Intern .php anhängen (mydomain.com/account -> mydomain.com/account.php)

Ich habe den ganzen Tag gegoogelt, Tausende von Dokumentationszeilen und Konfigurationstexten gelesen und ein paar Dutzend Mal ausprobiert ... Ich denke, mehr Verstand würde viel helfen.

AKTUALISIEREN

Wir haben eine Antwort auf unsere Frage gefunden (siehe unten).

7
Matt

Vielen Dank, dass Sie sich die Frage angesehen haben, aber anscheinend haben wir es 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 ausschalten, damit die Engine nicht verwirrt wird und stattdessen versuchen, auf eine index.* -Datei zu verweisen oder eine Verzeichnisliste (auch verwirrenderweise "Index" mit Apache ...) anzuzeigen, wenn ein Verzeichnis vorhanden ist scheint angefordert zu sein.

Die erste sichtbare Umleitung (R=301) entfernt den abschließenden Schrägstrich und die zweite schreibt ihn intern in die vorliegende PHP -Datei (oder HTML usw.).

Diese .htaccess-Datei unterstützt auch Abfragezeichenfolgen.

pdate Wie bereits in den Kommentaren erwähnt, haben wir zu Nginx gewechselt. Dies ist alles, was unsere Conf-Datei zum URL-Rewriting enthält (aus meiner Dev-Box):

location = / {
    index index.html;
}

try_files $uri $uri.html =404;

Wir haben auch von PHP zu einfachem HTML gewechselt, aber das Ändern der obigen Erweiterungen sollte kaum oder überhaupt keinen Unterschied machen.

7
Matt

Warum willst du/account nach /account.php umleiten? Tatsächlich existiert die Seite/das Konto nur mit Inhaltsverhandlung . Wenn Sie es nicht wollen, deaktivieren Sie einfach die Direktive.

Was Ihre beiden Regeln angeht, halte ich es für unkompliziert:

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

Es ist jedoch nicht getestet. Sie können der ersten Zeile auch [R,L] hinzufügen. In diesem Fall führt der Browser eine weitere Umleitung durch.

0
jcisio

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 können auch andere Vorteile nutzen.

Ich habe das Slim Framework zuvor zusammen mit der Symfony Templating Component mit großartigen Ergebnissen verwendet. Wenn ich es noch einmal machen würde, würde ich wahrscheinlich einfach das Silex Micro-Framework verwenden, da es auch Teil von Symfony Components ist.

0
Kevin C.