Beispiel für die aktuelle Dateistruktur:
example.com/foo.php
example.com/bar.html
example.com/directory/
example.com/directory/foo.php
example.com/directory/bar.html
example.com/cgi-bin/directory/foo.cgi*
Ich möchte HTML-, PHP- und CGI-Erweiterungen aus entfernen und dann den abschließenden Schrägstrich am Ende von URLs erzwingen. So könnte es aussehen:
example.com/foo/
example.com/bar/
example.com/directory/
example.com/directory/foo/
example.com/directory/bar/
example.com/cgi-bin/directory/foo/
Ich bin sehr frustriert, weil ich 17 Stunden lang direkt nach einer Lösung gesucht und mehr als ein paar hundert Seiten in verschiedenen Blogs und Foren besucht habe. Ich mache keine Witze. Ich glaube, ich habe meine Nachforschungen angestellt.
Hier ist der Code, der sich gerade in meiner .htaccess-Datei befindet:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(([^/]+/)*[^./]+)/$ $1.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]|/)$
RewriteRule (.*)$ /$1/ [R=301,L]
Wie Sie sehen können, entfernt dieser Code nur .html (und ich bin nicht sehr zufrieden damit, weil ich denke, dass es viel einfacher gemacht werden könnte). Ich kann die Erweiterung aus PHP-Dateien entfernen, wenn ich sie über .htaccess in .html umbenenne, aber das ist nicht das, was ich will. Ich möchte es gerade entfernen. Dies ist das erste, was ich nicht tun kann.
Das zweite ist eigentlich sehr nervig. Meine .htaccess-Datei mit dem obigen Code wird .html/
zu jeder nachfolgend eingegebenen Zeichenfolge hinzugefügt example.com/directory/foo/
. Wenn ich also eingebe example.com/directory/foo/bar
(offensichtlich /bar
nicht vorhanden, da foo
es sich um eine Datei handelt), anstatt nur die Nachricht anzuzeigen, dass die Seite nicht gefunden wurde, konvertiert sie diese in example.com/directory/foo/bar.html/
, sucht dann einige Sekunden lang nach einer Datei und zeigt dann die nicht gefundene Nachricht an. Das ist natürlich schlechtes Benehmen.
Also noch einmal, ich brauche den Code in .htaccess, um die folgenden Dinge zu tun:
- Entfernen Sie die HTML-Erweiterung
- Entfernen Sie die .php-Erweiterung
- Entfernen Sie die .cgi-Erweiterung
- Erzwingen Sie den abschließenden Schrägstrich am Ende von URLs
- Anforderungen sollten sich korrekt verhalten (keine zusätzlichen Schrägstriche oder Erweiterungen zu Zeichenfolgen hinzufügen, wenn Datei oder Verzeichnis auf dem Server nicht vorhanden sind).
- Der Code sollte so einfach wie möglich sein
@ Kronbernkzion ausgezeichnet. Das einzige Problem, das ich jetzt habe, ist, dass 404s nicht richtig zu funktionieren scheinen und mich zu einem wirklich funky Ort führen. Ich kann nicht einmal eine absolute 404-Weiterleitung verwenden.
ErrorDocument 404 http://www.google.com
Bist du darauf gestoßen? Wie bist du daran vorbei gekommen?
Abgesehen von der 404-Umschreibung war der vollständige Code, den ich verwendet habe:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} (.*)/$
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule (.*)/$ $1.html [L]
RewriteCond %{REQUEST_URI} (.*)/$
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule (.*)/$ $1.php [L]
RewriteCond %{REQUEST_URI} (.*)/$
RewriteCond %{REQUEST_FILENAME}\.cgi -f
RewriteRule (.*)/$ $1.cgi [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f [OR]
RewriteCond %{REQUEST_FILENAME}\.php -f [OR]
RewriteCond %{REQUEST_FILENAME}\.cgi -f
RewriteRule .* %{REQUEST_FILENAME}/ [R=301,L]
</IfModule>
/foo.html
und /bar.php
, werden Sie eine Regel haben , dass explizit paßt /foo/
zu /foo.html
und /bar/
zu /bar.php
? Oder benötigen Sie einen einzelnen generischen Eintrag, der /foo/
mit beiden /foo.html
ODER übereinstimmt /foo.php
(je nachdem, welcher vorhanden ist)?