Apache mod_rewrite
Was Sie suchen, ist mod_rewrite ,
Beschreibung: Bietet eine regelbasierte Umschreib-Engine zum schnellen Umschreiben angeforderter URLs.
Im Allgemeinen mod_rewrite
wird das angeforderte Dokument mit den angegebenen regulären Ausdrücken abgeglichen und anschließend intern (innerhalb des Apache-Prozesses) oder extern (im Client-Browser) neu geschrieben. Diese Umschreibungen können so einfach sein wie die interne Übersetzung von example.com/foo in eine Anfrage für example.com/foo/bar.
Die Apache-Dokumente enthalten eine mod_rewrite
Anleitung, und ich denke, einige der Dinge, die Sie tun möchten, werden darin behandelt. Detaillierte mod_rewrite Anleitung .
Erzwinge die www
Subdomain
Ich möchte, dass "www" vor jeder URL erzwungen wird, daher ist es nicht domain.com, sondern www.domain.com/page
Die Anleitung zum Umschreiben enthält Anweisungen hierzu im Beispiel Canonical Hostname .
Entfernen Sie die nachgestellten Schrägstriche (Teil 1).
Ich möchte alle abschließenden Schrägstriche von den Seiten entfernen
Ich bin mir nicht sicher, warum Sie dies tun möchten, da die Anleitung zum Umschreiben ein Beispiel für das genaue Gegenteil enthält , dh immer einen abschließenden Schrägstrich enthält. Die Dokumente legen nahe, dass das Entfernen des abschließenden Schrägstrichs ein großes Potenzial für Probleme hat:
Trailing Slash Problem
Beschreibung:
Jeder Webmaster kann ein Lied über das Problem des abschließenden Schrägstrichs in URLs singen, die auf Verzeichnisse verweisen. Wenn sie fehlen, gibt der Server einen Fehler aus, denn wenn Sie /~quux/foo
stattdessen sagen, /~quux/foo/
sucht der Server nach einer Datei mit dem Namen foo. Und weil diese Datei ein Verzeichnis ist, beschwert sie sich. Eigentlich versucht es in den meisten Fällen, es selbst zu beheben, aber manchmal muss dieser Mechanismus von Ihnen emuliert werden. Zum Beispiel, nachdem Sie viele komplizierte URL-Umschreibungen in CGI-Skripte usw. vorgenommen haben.
Vielleicht könnten Sie näher erläutern, warum Sie den abschließenden Schrägstrich ständig entfernen möchten?
.php
Verlängerung entfernen
Ich brauche es, um die .php zu entfernen
Das nächste, was ich mir vorstellen kann, ist, jedes Anforderungsdokument mit der Erweiterung .php intern neu zu schreiben, dh example.com/somepage wird stattdessen als Anforderung für example.com/somepage.php verarbeitet. Beachten Sie, dass für diese Vorgehensweise jede Seite tatsächlich als somepage.php im Dateisystem vorhanden sein muss.
Mit der richtigen Kombination von regulären Ausdrücken sollte dies bis zu einem gewissen Grad möglich sein. Ich kann jedoch einige mögliche Probleme vorhersehen, wenn Indexseiten nicht korrekt angefordert werden und Verzeichnisse nicht korrekt übereinstimmen.
Dadurch wird beispielsweise example.com/test als Anforderung für example.com/test.php korrekt umgeschrieben:
RewriteEngine on
RewriteRule ^(.*)$ $1.php
Wird jedoch dazu führen, dass example.com nicht geladen werden kann, da es kein example.com/.php gibt
Ich gehe davon aus, dass das Auswählen einer Anforderung für einen Verzeichnisindex aus einer Anforderung eines Dateinamens im übergeordneten Verzeichnis fast unmöglich wird, wenn Sie alle nachgestellten Schrägstriche entfernen. Wie ermitteln Sie eine Anfrage für das Verzeichnis 'foobar':
example.com/foobar
aus einer Anfrage für eine Datei namens foobar (die eigentlich foobar.php ist)
example.com/foobar
Es könnte möglich sein, wenn Sie die RewriteBase
Direktive verwendet haben. Wenn Sie dies tun, wird dieses Problem jedoch viel komplizierter, da Sie RewriteCond
Anweisungen benötigen , um auf Dateisystemebene zu überprüfen, ob die Anforderung einem Verzeichnis oder einer Datei zugeordnet ist.
Das heißt, wenn Sie Ihre Anforderung entfernen, alle nachgestellten Schrägstriche zu entfernen und stattdessen nachfolgende Schrägstriche zwangsweise hinzuzufügen, wird das Problem "Keine .php-Erweiterung" etwas vernünftiger.
# Turn on the rewrite engine
RewriteEngine on
# If the request doesn't end in .php (Case insensitive) continue processing rules
RewriteCond %{REQUEST_URI} !\.php$ [NC]
# If the request doesn't end in a slash continue processing the rules
RewriteCond %{REQUEST_URI} [^/]$
# Rewrite the request with a .php extension. L means this is the 'Last' rule
RewriteRule ^(.*)$ $1.php [L]
Dies ist immer noch nicht perfekt - an jede Anforderung für eine Datei wird immer noch .php intern an die Anforderung angehängt. Eine Anfrage für 'hi.txt' fügt dies in Ihre Fehlerprotokolle ein:
[Tue Oct 26 18:12:52 2010] [error] [client 71.61.190.56] script '/var/www/test.peopleareducks.com/rewrite/hi.txt.php' not found or unable to stat
Es gibt aber noch eine andere Option: Setzen Sie die Anweisungen DefaultType
und DirectoryIndex
wie folgt :
DefaultType application/x-httpd-php
DirectoryIndex index.php index.html
Update 14.11.2013 - Das obige Snippet wurde korrigiert, um die Beobachtung von Nicorellius zu berücksichtigen
Jetzt sind Anforderungen für hi.txt (und alles andere) erfolgreich, Anforderungen an example.com/test geben die verarbeitete Version von test.php zurück und index.php-Dateien funktionieren wieder.
Ich muss Kredit geben, wo Kredit für diese Lösung fällig ist, wie ich es Michael J. Radwins Blog gefunden habe, indem ich Google nach PHP ohne Erweiterung Apache durchsucht habe .
Entfernen Sie nachgestellte Schrägstriche
Einige apache remove trailing slashes
Suchanfragen haben mich zu einigen Seiten zur Suchmaschinenoptimierung geführt. Anscheinend stellen einige Content-Management-Systeme (in diesem Fall Drupal) Inhalte mit und ohne abschließenden Schrägstrich in URls zur Verfügung, was in der SEO-Welt dazu führt, dass Ihre Website eine doppelte Inhaltsstrafe erleidet. Quelle
Die Lösung scheint ziemlich trivial zu sein, da mod_rewrite
wir unter der Bedingung, dass die angeforderte Ressource mit a endet, /
neu schreiben und die URL durch Zurücksenden des 301 Permanent Redirect
HTTP-Headers neu schreiben .
Hier ist sein Beispiel, bei dem davon ausgegangen wird, dass Ihre Domain blamcast.net ist und der Anfrage optional ein Präfix vorangestellt werden kann www.
.
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
Jetzt kommen wir irgendwohin. Lassen Sie uns alles zusammenfügen und sehen, wie es aussieht.
Obligatorisch www.
, nein .php
und keine nachgestellten Schrägstriche
Dies setzt voraus, dass die Domain foobar.com ist und auf dem Standardport 80 ausgeführt wird.
# Process all files as PHP by default
DefaultType application/x-httpd-php
# Fix sub-directory requests by allowing 'index' as a DirectoryIndex value
DirectoryIndex index index.html
# Force the domain to load with the www subdomain prefix
# If the request doesn't start with www...
RewriteCond %{HTTP_HOST} !^www\.foobar\.com [NC]
# And the site name isn't empty
RewriteCond %{HTTP_HOST} !^$
# Finally rewrite the request: end of rules, don't escape the output, and force a 301 redirect
RewriteRule ^/?(.*) http://www.foobar.com/$1 [L,R,NE]
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foobar\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
Das 'R'-Flag wird im RewriteRule
Abschnitt zur Anweisung beschrieben. Snippet:
redirect|R [=code]
(Umleitung erzwingen) Präfix Ersetzen durch
http://thishost[:thisport]/
(wodurch die neue URL zu einem URI wird), um eine externe Umleitung zu erzwingen. Wenn kein Code angegeben wird, wird eine HTTP-Antwort von 302 ( MOVED TEMPORARILY ) zurückgegeben.
Schlussbemerkung
Ich konnte die Schrägstrichentfernung nicht erfolgreich ausführen. Die Umleitung führte zu endlosen Umleitungsschleifen. Nachdem ich die ursprüngliche Lösung genauer gelesen habe, habe ich den Eindruck, dass das obige Beispiel für sie funktioniert, da ihre Drupal-Installation konfiguriert ist. Er erwähnt speziell:
Auf einer normalen Drupal-Site mit aktivierten sauberen URLs sind diese beiden Adressen grundsätzlich austauschbar
In Bezug auf URLs, die mit und ohne Schrägstrich enden. Außerdem,
Drupal verwendet eine aufgerufene Datei .htaccess
, um Ihrem Webserver mitzuteilen, wie mit URLs umgegangen werden soll. Dies ist dieselbe Datei, die Drupals saubere URL-Magie aktiviert. Durch Hinzufügen eines einfachen Umleitungsbefehls am Anfang Ihrer
.htaccess
Datei können Sie den Server zwingen, alle nachgestellten Schrägstriche automatisch zu entfernen.