2016-05-31 7 views
0

Ich habe folgendes Szenario:mod_rewrite auslassen html Verlängerungsschleife

Zwei frontcontrollers in einem Web-Verzeichnis (document root):

web/frontend.php # handles all *.html requests 
web/backend.php # direct calls only 

Rewriting ist einfach so weit:

RewriteCond %{REQUEST_URI} !^/backend.php 
RewriteRule (.+)\.html$ /frontend.php [L] 

So jetzt, wenn ich example.org/backend.php anrufe, bin ich im Backend, nichts besonderes passiert. Und wenn ich etwas wie oder example.org/team/john.html rufe, wird es von frontend.php gehandhabt.

Funktioniert so weit!

Jetzt möchte ich die Möglichkeit, die Erweiterung * .html wegzulassen, so dass example.org/team/john intern als example.org/team/john.html behandelt wird.

RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule !.*\.html$ %{REQUEST_URI}.html [L] 

Last but not least habe ich Anfragen an john.html-john zu vermeiden doppelte Inhalte umleiten möchten.

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

Jeder Teil arbeitet auf seine eigenen, aber zusammen bekomme ich eine Schleife, das überrascht mich nicht, aber ich weiß nicht, wie dies zu vermeiden. Ich suchte die Dokumente, probierte mehrere Flaggen und Bedingungen aus, aber ich bin total festgefahren und brauche Hilfe.

Hier ist die ganze .htaccess-Datei:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteBase/

    # extend html extension internally 
    RewriteCond %{REQUEST_FILENAME}.html -f 
    RewriteRule !.*\.html$ %{REQUEST_URI}.html [L] 

    # redirect example.html to example 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} -f 
    RewriteCond %{REQUEST_URI} ^(.+)\.html$ 
    RewriteRule (.*)\.html$ /$1 [R=301,L] 

    # frontcontroller 
    RewriteCond %{REQUEST_URI} !^/backend.php 
    RewriteRule (.+)\.html$ /frontend.php [L] 
</IfModule> 

Jede Hilfe wäre toll.

Antwort

1

Um zu vermeiden, um eine Schleife zu verhindern, können Sie THE_REQUEST

RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} -f 
    RewriteCond %{THE_REQUEST} "\.html " 
    RewriteRule ^(.*)\.html$ /$1 [R,L] 

verwenden Nicht verwandt, aber Sie können Ihre Regeln vereinfachen. Erste

RewriteCond %{REQUEST_URI} !^/backend.php 
RewriteRule (.+)\.html$ /frontend.php [L] 

Sie bereits für (.+)\.html überprüfen, so können Sie die RewriteCond weglassen. Als nächstes verwenden Sie nicht den erfassten Teil (.+). Ersetzen Sie es durch ., um sicherzustellen, dass es nicht leer ist. Das gibt dann

RewriteRule .\.html$ /frontend.php [L] 

zweite, es sei denn, Sie *.html.html Dateien in Ihrer Website haben, brauchen Sie nicht für !html zu überprüfen und nur ^ für die RewriteRule Muster

RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule^%{REQUEST_URI}.html [L] 
+0

Super! Vielen Dank! –

1

Die Schleife ist aufgrund der vielen internen Umleitungen, Sie END Flag verwenden, können das Umschreiben Schleife

RewriteRule ^(.+)\.html$ /$1 [L,R=301] 
RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule !.*\.html$ %{REQUEST_URI}.html [END] 
+0

Gut, schnell nutzen können und hilfreich. Vielen Dank! Aber ich habe Olafs Antwort für den zusätzlichen Aufwand markiert. –