Wie implementiere ich das Umschreiben von URLs in meiner .htaccess-Datei?

17

Ich möchte eine URL umschreiben (Warum? Siehe diese Frage .), Damit Benutzer Adressen wie sehen

labouseur.com/course-compilers.html 

sie können stattdessen einfach sehen und verwenden

labouseur.com/course-compilers

(Noch besser, vielleicht sollte ich das umstrukturieren, damit es Kurse / Compiler sind.)

Ich verwende einen Linux-basierten Shared Hosting-Dienst für meine Website, daher habe ich keine administrative Kontrolle über den Server, aber ich habe Kontrolle über .htaccess. Die Referenzen, die ich online gelesen habe, schienen mir unklar zu sein, deshalb suche ich hier nach ein wenig Klarheit und Rat.

Alan
quelle
Beachten Sie, dass Sie dies nicht nur in der Serverkonfiguration (.htaccess) tun. Der wichtigste erste Schritt besteht darin, die URLs in Ihrer Anwendung tatsächlich zu ändern. Andernfalls werden Sie viele unnötige Weiterleitungen (oder doppelte Inhalte) erhalten.
MrWhite

Antworten:

13

Sie könnten tatsächlich .html von den Dateien auf Ihrem Server entfernen und Einstellungen in htaccess vornehmen, damit sie als HTML-Dateien bereitgestellt werden, aber das ist wahrscheinlich nicht das, wonach Sie suchen.

Mach das :

RewriteEngine on
# Check this condition to ensure that it's not a directory.
RewriteCond %{REQUEST_FILENAME} !-d
# Check this condition to ensure that there's a file there
RewriteCond %{REQUEST_FILENAME}\.html -f
# Replace html with your file extension, eg: php, htm, asp
RewriteRule ^(.*)$ $1.html
Rizwan Kassim
quelle
Dies ist komplexer, insbesondere wenn Sie sich Sorgen über Probleme mit doppelten Inhalten machen. Mit der obigen Regel können Sie weiterhin über die alten URLs auf Ihre Seiten zugreifen.
JasonBirch
3

Stellen Sie zunächst sicher, dass Apache über das Modul verfügt und dass es in .htacces-Dateien zulässig ist, und fügen Sie dann Folgendes hinzu:

RewriteEngine on

# Rewrite rules
RewriteRule ^/myoldsubfolder/(.*) /newfolder/$1 

Ihr Beispiel würde erfordern

RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI}\.html -f
RewriteRule ^/(([a-zA-Z0-9_]+)/?)$ /$1.html

Für eine einstufige Verzeichnisstruktur und

RewriteRule ^/(([a-zA-Z0-9_]+)/?)+$ /$1.html

Für eine mehrstufige Struktur.

Aber sei vorsichtig

Wenn Sie die Struktur haben

/site/.htaccess
/site/subfolder/.htaccess
/site/subfolder/cats/.htaccess

Die Umschreiberegeln in den untergeordneten .htaccessDateien sind relativ zum übergeordneten Ordner, und Sie können in unübersichtliche Situationen mit Umschreibeschleifen geraten. Stellen Sie sicher, dass Sie verwenden RewriteCond, um sie zu stoppen, wenn Sie können!

Aiden Bell
quelle
Haben Sie etwas dagegen, auf diesen letzten Punkt näher einzugehen (indem Sie RewriteCond verwenden, um die Schleifen zu stoppen)?
Travis Northcutt
2

Als Ergänzung zu obigen Antworten kann man verwenden

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^([\w-]+)$ $1.html [L]

([\w-]+) Ermöglicht Buchstaben und Ziffern mit einem Bindestrich (-).

(.*) schreibt jede Anfrage unabhängig davon neu, was möglicherweise andere folgende Regeln außer Kraft setzt, die beim Zugriff einen internen Serverfehler verursachen.

Abhishek Gurjar
quelle
Ihr RewriteRule Muster ist eine Verbesserung gegenüber der akzeptierten Antwort für das in der Frage angegebene Beispiel. Es wird jedoch nicht mit dem allgemeineren Fall übereinstimmen, wenn mehr als ein Pfadsegment vorhanden ist, z. /path/to/course-compilers. Fügen Sie das LFlag ein, um die Auswirkungen auf die folgenden Regeln zu verringern. Obwohl das (.*)Muster unnötig allgemein ist, ist es unwahrscheinlich, dass es ernsthafte Probleme verursacht, da der Zustand , der die Datei prüft, existiert.
MrWhite
1

Sie müssen dazu keine .htaccess-Datei verwenden. Strukturieren Sie Ihre Dateien einfach in Verzeichnisse und benennen Sie statt "labouseur.com/course-compilers.html" die Datei index.html in einem Verzeichnis namens "course-compilers". Wenn Sie dann auf dieses Verzeichnis zeigen, wird der Index standardmäßig bereitgestellt, jedoch nicht in der URL angezeigt. Sie könnten also einfach Ihre Links als "labourseur.com/course-compilers" schreiben und alles wird gut.

Kein .htaccess erforderlich.

Joel Glovier
quelle