2010-01-24 19 views
6

Ho un problema con la riscrittura di un URL a un dispatcher fastcgi. Se lascio solo:loop mod_rewrite anche con flag L

RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA] 

mi aspettavo L (ultima regola) per provocare una sola riscrittura. Invece, mantiene prepending dispatch.fcgi fino a quando apache segnala un errore.

So che può essere fissato con:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA] 

Ma qual è la ragione per molteplici riscritture? L fa qualcos'altro di quanto pensassi?

risposta

7

so che è una vecchia questione, ma per gli altri che cercano il risposta REALE, eccolo:

La bandiera [L]FA lavoro .htaccess file. Dice allo rewrite module di saltare tutte le seguenti regole in quel particolare file .htaccess. Fa il suo lavoro, Apache riscrive l'url ed esce dal file .htaccess.

Tuttavia, alla fine del file di .htaccessse la richiesta URL è stato riscritto, l'intero processo URL corrispondente inizia di nuovo con il nuovo URL.

Questo è ciò che accade sopra, ^(.*)$ sarà abbinare sempre l'URL attuale, provoca un ciclo infinito, solo l'opzione maxredirect riscrittura (10 di default) arresta.

Il test attributo !-f file di (come citato da l'interrogante) sarebbe risolvere il problema, dal momento che l'url corrisponderà un vero e proprio nome di file:!

RewriteCond% {} REQUEST_FILENAME -f

RewriteRule^(. *) $ Spedizione.fcgi/$ 1 [L, QSA]

ora, se chiediamo http://example.com/toappend, .htaccess riscrive a dispatch.fcgi/toappend e nessuna riscrittura ciclo accadrà.

+0

Perchè se faccio 'rewriterule. */Index.php' , c'è un ciclo infinito, eppure se faccio 'rewriterule. * index.php' non ci sono loop? – Pacerier

+0

Ok, ho trovato l'ans e l'ho scritto qui linkato qui – Pacerier

2

Apparentemente - e ho letto solo questo qui, non ho conoscenza di prima mano - la direttiva [L] non funziona nei file .htaccess, solo se è nel tuo file .conf.

See: Hidden features of mod_rewrite

all'interno del contesto .htaccess, [L] si Non forzare mod_rewrite a fermarsi. sarà continuerà a innescare interno

+0

Immagino che risponda anche a http://stackoverflow.com/questions/1775877/ - sfortunatamente la vera risposta non è stata segnata lì ... – viraptor

6

Hy, aggiungere questo dopo RewriteEngine On

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

.. e dovrebbe funzionare loop stoping.