2010-01-20 26 views
25

Date queste condizioni (lo so che cosa significano/fanno):mod_rewrite: cosa fa questo RewriteRule?

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 

Che cosa dice la regola prima fare? Per cosa è quella trattativa solitaria?

RewriteRule ^.*$ - [NC,L] 
RewriteRule ^.*$ /index.php [NC,L] 

Sto usando questo per un bel po 'di tempo in combinazione con Zend Framework, ma non ho mai ottenuto quello che la prima regola fa esattamente.

risposta

46

Il RewriteCond directive descrive semplicemente una condizione aggiuntiva per un RewriteRule directive. Quindi RewriteCond deve essere sempre associato a RewriteRule.

Nel tuo caso i tre RewriteCond probabilmente appartengono al primo RewriteRule in questo modo:

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L] 

Ora, questa regola viene applicata se il modello del RewriteRule corrisponda all'URL richiesta corrente (per directory percorso spogliato prima) e se la condizione è soddisfatta.

In questo caso la condizione è vera solo se la mappatura l'URL della richiesta al filesystem corrisponde sia un file esistente con la dimensione del file maggiore di 0 (-s), o un link simbolico (-l) o una directory (-d). Quindi la tua regola verrà applicata per qualsiasi URL (^.*$ corrisponde a qualsiasi cosa) che può essere mappato a qualcosa che esiste nel tuo filesystem. La sostituzione - significa semplicemente non cambiare nulla. E la NC (nessun caso, case insensitive, inutile in questo contesto) e L (ultima regola se applicata) sono flags che modificano sia il modello, la sostituzione o l'esecuzione della regola.

+0

Aaahh sì, ha senso. Spiegazione molto chiara Grazie. –

+0

Quindi qual è lo scopo di non cambiarlo? La combinazione delle 2 regole di riscrittura dice "se esiste, mostrala, altrimenti inoltra tutto il resto a index.php" –

+1

@WillshawMedia Sì, la regola menzionata lascia praticamente intatta qualsiasi richiesta a un file esistente ed esce dal processo di riscrittura. Quindi in combinazione con l'altra regola: riscrivi solo qualsiasi file non esistente in * index.php *. – Gumbo