2010-06-21 18 views
6

Ho un sito in cui tutte le pagine sono script php, quindi gli URL terminano con .php.Uso di mod_rewrite per nascondere .php dalla fine degli URL

ho aggiunto quanto segue in un file .htaccess, e ora posso accedere ai file .php senza l'estensione .php:

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 

Fin qui tutto bene. Ma ora voglio aggiungere un reindirizzamento su tutti i file .php in modo che tutti i vecchi link al di fuori del mio controllo vengano reindirizzati alla nuova versione dell'URL.

Ho provato questo:

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 

ma che sembra per inviare un redirect anche per gli URL che non terminano in .php, in modo da ottenere bloccato in un ciclo infinito. Qualsiasi altra combinazione che provo sembra non corrispondere a nessuna richiesta (e lasciarmi a page.php) oa tutte le richieste (e farmi bloccare in un loop).

+1

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

risposta

7
RewriteEngine On 

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

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

Solo %{THE_REQUEST} non viene riscritta nel reindirizzamento interno che avviene nella seconda regola (%{REQUEST_URI}, d'altra parte, è).

0

È riorientare le pagine che terminano con .php alla pagina senza .php

Allora la vostra prima regola rewites tutte le pagine non terminano con .php al nome della pagina che termina con .php

Questo è il motivo per cui si dispone un ciclo :-)

+0

Ho riscritto la domanda con il mio file .htaccess in pieno. La regola che aggiunge la .php viene dopo quella che la rimuove e reindirizza. AFAICS, qualcosa non va con il RewriteCond – rjmunro

0

Aggiungi NS alla lista parametri di quella ultima regola

+0

Ho pensato che avrebbe funzionato anche, ma non sembra funzionare. Inoltre, per la condizione 'RewriteCond% {IS_SUBREQ} = false', ottengo' [localhost/sid # 1fd6de0] [rid #aa2e20/initial/redir # 1] (4) [perdir U:/htdocs /] RewriteCond: input = 'false' pattern = '= false' => matched' – Artefacto

+0

Questo non ha funzionato per me. – rjmunro

0

potreste essere in grado di aggiungere anche [L] al RewriteRule per l'aggiunta di .php, in modo che si ferma processo ing altre regole:

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

Ho provato questo e non ha fatto alcuna differenza. L'ho aggiunto alla versione nella domanda per salvare l'ambiguità. – rjmunro

0

Grazie ad un puntatore a this question da @TheDeadMedic, sono stato in grado di trovare una soluzione al mio problema cambiando:

RewriteCond %{REQUEST_URI} .*\.php 

a:

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

Non capisco perché la mia versione non abbia fatto la stessa cosa, però.

+0

Vedi la mia risposta. La tua soluzione è leggermente diversa (funziona solo per le richieste GET). – Artefacto