2009-06-12 1 views
2

Wie kann ich einen Schrägstrich hinzuzufügen:nachgestellten Schrägstrich

RewriteEngine on 
RewriteRule !\.(js|ico|gif|jpg|png|css|html)$ index.php 

Ich habe versucht, mit:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.+[^/])$ $1/ [R] 

Aber es funktioniert nicht

+0

mir Sieht OK – Greg

+0

Können Sie uns einige weitere Informationen geben (obwohl + wirklich sein sollte. *.)? Vielleicht darüber, wie du diese Regel getestet hast. – Gumbo

+0

Der Inhalt, den ich gepostet habe, ist was meine .htacess enthält, diese RewriteRule! \. (Js | ico | gif | jpg | png | css | html) $ index.php kopiert von Zend. –

Antwort

3

Siehe Detail/Textzeile für die CondPatterns -d und -f für RewriteCond. Sehen Sie, wie es heißt "testet ob es existiert und ist eine normale Datei"? Das ist teuer und skaliert überhaupt nicht gut. Ist es dir wirklich wichtig, wenn es sich um eine "normale Datei" handelt? Nein, es interessiert Sie nur, wenn es wie eine Datei aussieht. (entspricht dem Dateinamen.extension Muster) Also, ich werde deine Rewrite verbessern, während ich dabei bin.

Siehe das Detail/die Beschreibung für das 'letzte | L' Flag für RewriteRule. Sehen Sie, wie es heißt "Wenden Sie keine weiteren Regeln an"? Ich wette, das ist was du willst, nicht wahr? Sie möchten entweder index.php verwenden, wenn eine Anfrage nicht mit der Erweiterung einer statischen Anlage übereinstimmt, ODER Sie möchten am Ende einer Anfrage einen Schrägstrich setzen, der nicht mit dem Dateinamen.extension Muster übereinstimmt . Nicht beide.

Hier ist, wie Sie das tun:

# turn on matching 
RewriteEngine on 

# 1st rule block. If any of the conditions don't apply skip over this block to the next. 
# condition: uri ends with filename.extension 
RewriteCond %{REQUEST_URI} [^/.]+\.[^/.]+$ 
# condition: uri doesn't end with a desired extension 
RewriteCond %{REQUEST_URI} !\.(js|ico|gif|jpg|png|css|html)$ [NC] 
# rewrite the request to be for index.php and don't apply any more rules 
RewriteRule - index.php [L] 

# 2nd rule block. If any of the conditions don't apply skip over this block to the next. 
# condition: uri doesn't end with a slash 
RewriteCond %{REQUEST_URI} !/$ 
# condition: uri doesn't end with filename.extension 
RewriteCond %{REQUEST_URI} !/[^/]+\.[^/.]+$ 
# rewrite the request to be appended with a slash 
RewriteRule (.*) $1/ [R=301] 

Dies ist eine sehr gute Antwort bedenkt, dass Sie nicht uns sagen wollten Sie versuchen zu tun. Wenn Sie eine bessere Antwort wünschen, müssen Sie uns mehr Informationen geben als "Ich kopierte und kopierte zwei Code-Snipets zusammen, aber es funktioniert nicht."


Update: Ich warf hastig zusammen bearbeitet, um diese Antwort auf cornegigouille Antwort basiert. Hier ist ein Bash-Shell-Transkript des Beweises, den ich gemacht habe, um es zu testen. Lass es mich wissen, wenn du einen Fehler siehst.

#bruno:~$ (
for str in asdf asdf.css asdf.min.css; do 
    echo -e "\n## $str ##" 
    echo /brunobronosky1/$str | grep -E '/[^/.]+\.[^/.]+$' || echo '[no match]' 
    echo /brunobronosky2/$str | grep -E '/[^/]+\.[^/.]+$' || echo '[no match]' 
    echo /cornegigouille/$str | grep -E '/[^/.]+(\.[^/.]+)+$' || echo '[no match]' 
done 
) 

## asdf ## 
[no match] 
[no match] 
[no match] 

## asdf.css ## 
/brunobronosky1/asdf.css 
/brunobronosky2/asdf.css 
/cornegigouille/asdf.css 

## asdf.min.css ## 
[no match] 
/brunobronosky2/asdf.min.css 
/cornegigouille/asdf.min.css 
+0

HINWEIS: Um die Integrität der @ Cornegigouille Antwort zu erhalten, möchte ich aufzeichnen, dass ich ursprünglich einen Punkt im ersten Zeichensatz des letzten RewriteCond hatte, so: 'RewriteCond% {REQUEST_URI}!/[^ /.] + \ . [^ /.] + $ 'Das war ein Fehler, der meinen Code spröde gemacht hat. Ich habe es seitdem korrigiert, dank ihnen, die fürsorglich genug sind, um darauf hinzuweisen. –

1

Brunos Antwort ist großartig, aber unvollständig.
Es behandelt nicht den Fall, in dem ein Dateiname mehrere Punkte enthält. Dies ist durchaus üblich, wenn Sie mit der Verkleinerung beginnen (z. B. www.mysite.com/css/styles.min.css). sein daher

sollte der zweite Zustand des zweiten Regelblock:

# condition: uri doesn't end with filename.extension 
RewriteCond %{REQUEST_URI} !/[^/.]+(\.[^/.]+)+$ 
+1

7 Jahre später ... schön! –

+0

Ja, 7 Jahre später hilft das OP nicht, aber es hilft der Gemeinschaft. –

+1

Großer Fang, @cornegigouille. Ich glaube jedoch, dass mein Fehler korrigiert werden kann, indem die Komplexität der Regex verringert wird, anstatt sie zu erhöhen. Scheint das für dich zu funktionieren? 'für str in/asdfcss /asdf.css /asdf.min.css; echo "## $ str ##"; echo $ str | grep -E '/[^/]+\.[^/.] + $ '; fertig, denke ich, aber ich bin nach so langer Zeit mental aus dem Zusammenhang gerissen. –