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
mir Sieht OK – Greg
Können Sie uns einige weitere Informationen geben (obwohl + wirklich sein sollte. *.)? Vielleicht darüber, wie du diese Regel getestet hast. – Gumbo
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. –