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 .htaccess
Code:
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 ##
php
apache
.htaccess
mod-rewrite
Luke
quelle
quelle
Antworten:
Fügen Sie direkt unter der
RewriteEngine On
Linie 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=301
Teile, weil, wie in einem Kommentar erklärt:Nachdem Sie Ihre Tests abgeschlossen haben, können Sie verwenden
R=301
.quelle
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"$1
Anstelle von/$1
And, @JonathanWeber, wird die .htaccess-Datei nicht bereitgestellt, aber der Expires-Header teilt den Browsern mit, wie lange eine Ressource zwischengespeichert werden soll.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_URI
die mit einem Schrägstrich beginnt (zumindest in.htaccess
Dateien):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 StammverzeichnisREQUEST_URI
entspricht/
, 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. )
quelle
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} (.+?)/+$
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
quelle
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.
quelle
# nginx configuration location / { rewrite ^(.*)$ /%1 redirect; rewrite ^(.*)$ /%1 redirect; rewrite ^/([^\.]+)$ /$1.html break; } location ~ ^.*\.([Hh][Tt][Aa]) { deny all; }