2009-01-31 12 views
9

Sto cercando di creare URL puliti sul mio sito web. Ora sono riuscito a configurare Apache così ogni richiesta come mysite.com/page funzionerà. Ma voglio anche che le richieste per mysite.com/page.php vengano reindirizzate a mysite.com/page. Ho impostato variabile d'ambiente in .htaccess per controllare se ho già stato reindirizzato per evitare loop, ma ho ancora ottenere loro ... Ecco il .htaccess:Clean URL Redirect Loop

<IfModule mod_rewrite.c> 
Options +FollowSymlinks 

RewriteEngine On 
RewriteBase/

# set the variable 
RewriteRule ^$ - [L] 
RewriteRule ^(.*)$ $1 [E=REWROTE:0] 

# this works fine 
# make mysite.com/page work and set REWROTE variable to 1 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php [L,E=REWROTE:1] 

# but if i enable this, i get redirected and then stuck in a loop 
# redirect mysite.com/page.php to mysite.com/page , but only if REWROTE not 1 
#RewriteCond %{ENV:REWROTE} !^1$ 
#RewriteRule ^(.*)\.php$ $1 [R=301,L] 

Grazie!

+0

Benvenuti a overflow dello stack. Grazie per aver formulato la tua domanda in modo chiaro, fornendo codice e mostrando cosa funziona e cosa no. Se hai informazioni utili nei tuoi log di apache, per favore pubblica anche questo. A volte i problemi di reindirizzamento diventano più evidenti quando si visualizzano i registri. –

+0

Purtroppo non ho accesso a questo tipo di informazioni. – oxeleo

risposta

14

Aggiungere questa regola di sopra delle regole di riscrittura esistenti per fermare il reindirizzamento se la richiesta è già stata riorientata volta (ref):

RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule .* - [L] 
+0

Bingo! Ha funzionato come un fascino e non c'è bisogno della variabile di ambiente. – oxeleo

1

Si potrebbe verificare la linea di richiesta di ciò che è stato originariamente richiesto:

RewriteCond %{THE_REQUEST} ^[A-Z]+\ (/[^\ ]*)\.php[?\ ] 
RewriteRule \.php$ %1 [R=301,L] 

Oh, e il primo argomento di RewriteCond directive non è un'espressione regolare ma solo una stringa. Quindi la fuga dal . è sbagliata.

+0

Grazie, questo ha funzionato per me :) –

0

C'è qualche motivo per cui non è possibile utilizzare il carattere di fine stringa, $?

RewriteRule ^/(.+)\.php$ /$1 

reindirizzerà /page.php a/page ma non eseguirà alcun reindirizzamento su/page.

Fondamentalmente, l'utilizzo di tecniche come l'impostazione di variabili di ambiente e l'aggiunta di controlli per REDIRECT_STATUS non sarà molto affidabile.