2010-06-21 7 views
6

Ich habe eine Website, wo alle Seiten PHP-Skripte sind, so dass die URLs .php enden.Mit mod_rewrite verstecken .php vom Ende der URLs

Ich habe folgendes auf eine .htaccess-Datei hinzugefügt, und ich kann jetzt die .php Dateien ohne die Erweiterung .php zugreifen:

RewriteEngine On # Turn on rewriting 

RewriteCond %{REQUEST_FILENAME}.php -f # If the requested file with .php on the end exists 
RewriteRule ^(.*)$ $1.php # serve the PHP file 

So weit so gut. Aber jetzt möchte ich eine Umleitung für alle .php-Dateien hinzufügen, so dass alle alten Links außerhalb meiner Kontrolle auf die neue Version der URL umgeleitet werden.

Ich habe dies versucht:

RewriteEngine On # Turn on rewriting 

RewriteCond %{REQUEST_URI} .*\.php 
RewriteRule ^(.*)\.php$ http://example.com/$1 [R=permanent,L] 

RewriteCond %{REQUEST_FILENAME}.php -f # If the requested file with .php on the end exists 
RewriteRule ^(.*)$ $1.php [L] # serve the PHP file 

aber das scheint eine Umleitung auch für URLs zu senden, die in .php nicht am Ende, so dass ich in einer Endlosschleife stecken. Jede andere Kombination, die ich versuche, scheint keine Anfragen zu erfüllen (und lassen Sie mich bei page.php) oder alle Anfragen (und mich in einer Schleife stecken).

+1

Check out http://stackoverflow.com/questions/3024631/htaccess-remove-php-extension-index-php-and-add-trailing-slash/ – TheDeadMedic

Antwort

7
RewriteEngine On 

RewriteCond %{THE_REQUEST} ^\w+\ /(.*)\.php(\?.*)?\ HTTP/ 
RewriteRule^http://%{HTTP_HOST}/%1 [R=301] 

RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule .* $0.php 

Nur %{THE_REQUEST} nicht in der internen Umleitung neu geschrieben, die in der zweiten Regel geschieht (%{REQUEST_URI}, auf der anderen Seite ist).

0

Sie Umleiten Seiten mit .php auf die Seite ohne .php mit .php

Endung

Dann ist Ihre erste Regel rewites alle Seiten nicht mit .php auf den Seitennamen endet Endung Aus diesem Grund haben Sie eine Schleife :-)

+0

Ich habe die Frage mit meiner .htaccess-Datei in umgeschrieben voll. Die Regel, die die .php hinzufügt, kommt nach demjenigen, der sie entfernt und weiterleitet. AFAICS, etwas stimmt nicht mit dem RewriteCond – rjmunro

0

NS auf Parameter Liste dieser letzten Regel hinzufügen

+0

Ich dachte, das würde auch funktionieren, aber es scheint nicht zu funktionieren. Für die Bedingung 'RewriteCond% {IS_SUBREQ} = false 'bekomme ich außerdem' [localhost/sid # 1fd6de0] [rid # 5aa2e20/initial/redir # 1] (4) [perdir U:/htdocs /] RewriteCond: Eingabe = 'false' pattern = '= false' => matched' – Artefacto

+0

Das hat bei mir nicht funktioniert. – rjmunro

0

Sie könnten auch in der Lage sein [L] für das hinzufügen von .php zum RewriteRule hinzuzufügen, so dass es Prozess beendet ing die anderen Regeln:

RewriteRule ^(.*)$ $1.php [L] # serve the PHP file 
+0

Ich habe das versucht und es machte keinen Unterschied. Ich habe es der Version in der Frage hinzugefügt, um Mehrdeutigkeit zu sparen. – rjmunro

0

Dank einen Zeiger auf this question von @TheDeadMedic, ich war in der Lage, eine Lösung für mein eigenes Problem zu finden, indem:

RewriteCond %{REQUEST_URI} .*\.php 

zu:

RewriteCond %{THE_REQUEST} ^GET\ (.*)\.php\ HTTP 

Ich verstehe nicht, warum meine Version nicht das gleiche getan hat, obwohl.

+0

Siehe meine Antwort. Ihre Lösung ist nur geringfügig anders (funktioniert nur für GET-Anfragen). – Artefacto