Htaccess: Hinzufügen / Entfernen eines abschließenden Schrägstrichs zur URL

80

Auf meiner Website wird ein Skript mit dem Namen -> WSS-Hintergrundskript ausgeführt

Mein Problem -> Ich habe versucht, das Entfernen oder Hinzufügen eines abschließenden Schrägstrichs am Ende meiner URL zu erzwingen, um doppelten Inhalt zu verhindern und auch meine URLs zu bereinigen.

Ich habe alle möglichen Dinge ausprobiert und alles versucht, was mir einfiel und aus den Interwebs geladen wurde, aber noch kein solches Glück! Es mag eine schnelle Lösung sein, aber ich habe es mir so genau angesehen, dass ich wahrscheinlich blind für etwas absolut Offensichtliches bin.

Also präsentiere ich Ihnen meinen ganzen .htaccessCode:

DirectoryIndex index.php

RewriteEngine on
RewriteRule ^download/([0-9]+)?/([0-9]+)x([0-9]+)/([^/\.]+) image.php?id=$1&width=$2&height=$3&cropratio=$4&download=1 [L]
RewriteRule ^file/([0-9]+)?/([0-9]+)x([0-9]+)/([^/\.]+) image.php?id=$1&width=$2&height=$3&cropratio=$4 [L]
RewriteRule ^preview/([0-9]+)?/([0-9]+)x([0-9]+)/([^/\.]+) wallpaper_preview.php?id=$1&width=$2&height=$3&name=$4 [L]
RewriteRule ^thumbnail/([0-9]+)?/([0-9]+)x([0-9]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/]+) image.php?wallpaper_id=$1&width=$2&height=$3&cropratio=$4&align=$5&valign=$6&file=$7 [L]
RewriteRule ^cat/([0-9]+)?/([^/\.]+)/p([0-9]+) index.php?task=category&id=$1&name=$2&page=$3 [L]
RewriteRule ^cat/([0-9]+)?/([^/\.]+)/([0-9a-zA-Z?-]+)/p([0-9]+) index.php?task=category&id=$1&name=$2&sortby=$3&page=$4 [L]
RewriteRule ^cat/([0-9]+)?/([^/\.]+)/([0-9a-zA-Z?-]+)-([0-9]+) index.php?task=category&id=$1&sortby=$3&page=$4 [L]
RewriteRule ^cat/([0-9]+)?/([^/\.]+) index.php?task=category&id=$1&name=$2 [L]
RewriteRule ^tag/([^/\.]+)/([0-9a-zA-Z?-]+)/([0-9]+) index.php?task=tag&t=$1&sortby=$2&page=$3 [L]
RewriteRule ^tag/([^/\.]+) index.php?task=tag&t=$1 [L]
RewriteRule ^profile/([0-9]+)?/([^/\.]+) index.php?task=profile&id=$1&name=$2 [L]
RewriteRule ^profile/comments/([0-9]+)?/([^/\.]+) index.php?task=users_comments&id=$1&name=$2 [L]
RewriteRule ^page/([0-9]+) index.php?task=view_page&id=$1 [L]  
RewriteRule ^register index.php?task=register [L] 
RewriteRule ^lost-password index.php?task=lost_pass [L] 
RewriteRule ^links index.php?task=links [L]
RewriteRule ^news/item/([0-9]+)/([^/\.]+) index.php?task=news&id=$1 [L]
RewriteRule ^news/page([0-9]+) index.php?task=news&page=$1 [L]
RewriteRule ^members/([^/\.]+)-([^/\.]+)/page([0-9]+)? index.php?task=member_list&sort=$1&order=$2&page=$3 [L]
RewriteRule ^members index.php?task=member_list [L]
RewriteRule ^messages index.php?task=messages [L]
RewriteRule ^submit index.php?task=submit [L]
RewriteRule ^search/([^/\.]+) index.php?task=search&q=$1 [L]
RewriteRule ^search index.php?task=search [L]
RewriteRule ^submit index.php?task=submit [L]
RewriteRule ^r-([0-9]+)?-([0-9]+)? go.php?id=$1&ref=$2 [L]
RewriteRule ^r-([0-9]+)? go.php?id=$1 [L]
RewriteRule ^([^/\.]+)/([0-9]+)/([^/\.]+) index.php?task=view&id=$2&name=$3 [L]
RewriteRule ^news/([^/\.]+) index.php?task=news&name=$1 [L]
RewriteRule ^profile/([^/\.]+) index.php?task=profile&name=$1 [L]
RewriteRule ^news index.php?task=news [L]
RewriteRule ^page/([^/\.]+) index.php?task=view_page&name=$1 [L]  
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/([0-9a-zA-Z'?-]+)/([0-9]+) index.php?task=category&name=$1&sortby=$2&page=$3 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/([^/\.]+) index.php?task=view&name=$2 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+) index.php?task=category&name=$1 [L]


## www reslove ##
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
## www reslove ##

## index reslove ##
Options +FollowSymLinks
RewriteCond %{THE_REQUEST} ^.*/index\.php
RewriteRule ^(.*)index.php$ http://www.epicwallpaper.net/$1 [R=301,L]
## index reslove ##
Luke
quelle
1
Auch wenn jemand den bösen Jungen reparieren kann, können Sie hier eine Antwort posten. Danke
Luke
Bitte posten Sie den Code hier.
Surreale Träume
1
Bearbeiten Sie Ihren Beitrag, fügen Sie Ihren Code in Ihren Beitrag ein, markieren Sie ihn und drücken Sie "STRG + K", um ihn als Code zu formatieren
Jon Lin
Hast du wirklich ' oder ? in deiner URI erlaubt? Eine der RewriteRules (unten) schlägt dies vor. Ich mache mir Sorgen, dass sie den Server verwirren könnten, noch bevor .htaccess sie verarbeiten kann.
Phil Perry

Antworten:

193

Fügen Sie direkt unter der RewriteEngine OnLinie hinzu:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R] # <- for test, for prod use [L,R=301]

eine No-Trailing-Slash-Richtlinie durchzusetzen.

So erzwingen Sie eine Richtlinie für abschließende Schrägstriche:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ /$1/ [L,R] # <- for test, for prod use [L,R=301]

BEARBEITEN : kommentierte die R=301Teile, weil, wie in einem Kommentar erklärt:

Sei vorsichtig damitR=301 ! Wenn viele Browser die .htaccess-Datei dort haben, wird sie auf unbestimmte Zeit zwischengespeichert : Es wird irgendwie irreversibel, wenn Sie den Browser-Cache nicht auf allen Computern löschen können, die sie geöffnet haben. Gehen Sie beim Testen besser mit einfach RoderR=302

Nachdem Sie Ihre Tests abgeschlossen haben, können Sie verwenden R=301.

Jon Lin
quelle
4
Gott, ich könnte dich küssen! Arbeitete mit der Durchsetzung eines No-Trailing-Slashs der andere gab mir 500 Serverfehler Danke Jon Lin!
Luke
21
Die No-Trailing-Slash-Regel funktioniert nicht, wenn sich die Website in einem Verzeichnis befindet (wie example.org/blog/)
Gras Double
7
Sei vorsichtig damit R=301! Wenn Sie es dort haben, speichern viele Browser die .htaccess-Datei auf unbestimmte Zeit im Cache: Es wird irgendwie irreversibel, wenn Sie den Browser-Cache nicht auf allen Computern löschen können, die es geöffnet haben. Gehen Sie beim Testen besser mit einfachem "R" oder "R = 302"
Jonathan Weber
Wenn VirtualDocumentRoot deaktiviert ist, entfernen Sie den Schrägstrich am Anfang, dh: $1Anstelle von /$1And, @JonathanWeber, wird die .htaccess-Datei nicht bereitgestellt, aber der Expires-Header teilt den Browsern mit, wie lange eine Ressource zwischengespeichert werden soll.
zweimal
1
@Nrc, da es neben Dateien und Verzeichnissen noch andere Arten von Zuordnungen gibt und die Möglichkeit besteht, dass eine Anforderung weder einer Datei noch einem Verzeichnis zugeordnet wird, sondern neu geschrieben werden muss. Das Negativ stellt sicher, dass etwas übersprungen wird, das entweder neu geschrieben wurde oder bereits einem Element im Dateisystem zugeordnet ist.
Jon Lin
84

Um Jon Lins Antwort zu ergänzen, gibt es hier eine No-Trailing-Slash-Technik, die auch funktioniert, wenn sich die Website in einem Verzeichnis befindet (wie example.org/blog/):

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [R=301,L]


Der Vollständigkeit halber ist hier eine alternative Hervorhebung aufgeführt, REQUEST_URIdie mit einem Schrägstrich beginnt (zumindest in .htaccessDateien):

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /(.*)/$
RewriteRule ^ /%1 [R=301,L] <-- added slash here too, don't forget it

Nur nicht benutzen %{REQUEST_URI} (.*)/$ . Da im Stammverzeichnis REQUEST_URIentspricht /, den führenden Schrägstrich, und es würde als ein Schrägstrich falsch interpretiert werden.


Wenn Sie mehr lesen möchten:

(Update: Diese Technik ist jetzt in Laravel 5.5 implementiert. )

Gras Double
quelle
1
Diese spezielle Variante ist besonders bei Verwendung moderner URL-Konventionen sehr nützlich. Ich hoffe, es macht Ihnen nichts aus, ich sende es an das htaccess-Snippets-Repository .
Alexw
1
Dies beseitigt das Problem, wenn REQUEST_URI (root) als abschließender Schrägstrich interpretiert wird, der auch eine Endlosschleife verursacht. Vielen Dank
Ruslan Abuzant
Ja, akzeptierte Antworten sind nicht erforderlich, wenn sich die Website in einem Verzeichnis befindet. Diese Antwort RewriteCond %{REQUEST_URI} (.+)/$entfernt jedoch nur einen letzten abschließenden Schrägstrich (z. B. mehrere Weiterleitungen von etw /// nach etw // nach etw / nach etw). Um alle nachgestellten Schrägstriche in einer Umleitung zu entfernen, verwenden Sie eine bessere LösungRewriteCond %{REQUEST_URI} (.+?)/+$
Mikep
1
Ich hatte auch darüber nachgedacht. Obwohl das Ergebnis korrekt ist und ich es als Randfall betrachte, habe ich die Einfachheit des Codes bevorzugt.
Gras Double
@GrasDouble, danke, dass Sie schon lange nach dieser Lösung gesucht haben. habe unzählige Methoden ausprobiert, aber du hast gut funktioniert! ein großes Dankeschön.
3

Dies habe ich für meine neueste App verwendet.

# redirect the main page to landing
##RedirectMatch 302 ^/$ /landing

# remove php ext from url
# /programming/4026021/remove-php-extension-with-htaccess
RewriteEngine on 

# File exists but has a trailing slash
# /programming/21417263/htaccess-add-remove-trailing-slash-from-url
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?(.*)/+$ /$1 [R=302,L,QSA]

# ok. It will still find the file but relative assets won't load
# e.g. page: /landing/  -> assets/js/main.js/main
# that's we have the rules above.
RewriteCond %{REQUEST_FILENAME} !\.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^/?(.*?)/?$ $1.php
Svetoslav Marinov
quelle
1
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
## hide .html extension
# To externally redirect /dir/foo.html to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+).html
RewriteRule ^ %1 [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)/\s
RewriteRule ^ %1 [R=301,L]

## To internally redirect /dir/foo to /dir/foo.html
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^([^\.]+)$ $1.html [L]


<Files ~"^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</Files>

Dies entfernt HTML-Code oder PHP, wenn Sie es ergänzen. Ermöglicht das Hinzufügen eines abschließenden Schrägstrichs sowie der URL, ohne dass der abschließende Schrägstrich den 404-Code umgeht. Plus ein wenig zusätzliche Sicherheit.

Scout Hynson
quelle
Hallo, wie würdest du das für Nginx schreiben? Ich habe versucht, es in einem Konverter hier auszuführen : winginx.com/de/htaccess, aber dieses Ergebnis gibt mir Endlosschleife:# nginx configuration location / { rewrite ^(.*)$ /%1 redirect; rewrite ^(.*)$ /%1 redirect; rewrite ^/([^\.]+)$ /$1.html break; } location ~ ^.*\.([Hh][Tt][Aa]) { deny all; }
Asle