2012-11-13 17 views
17

Sto configurando le regole di riscrittura di Apache per riordinare i miei URL CodeIgniter.

This question (e un sacco di messaggi, ecc forum che ho trovato in giro per il luogo) documento l'uso della seguente regola (o qualcosa di molto simile):

RewriteEngine on 
RewriteCond $1 !^(index\.php|phpinfo\.php|images|robots\.txt|sitemap\.xml\.gz|sitemap\.xml|assets) 
RewriteRule ^(.*)$ /index.php/$1 [L] 

So che il $ 1 dopo l'RewriteRule si riferisce alla stringa catturata da (. *), ma cosa rappresenta il primo $ 1 (subito dopo il RewriteCond)? Un sacco di esempi che ho visto usano qualcosa come% {REQUEST_URI} come primo argomento per RewriteCond.

risposta

17

Il $1 è fondamentalmente il contenuto catturato di tutto dall'inizio e dalla fine della stringa. In altre parole, $1 = (.*).

Nella tua riscrittura, il ^ significa l'inizio della stringa, il (.*) dice per abbinare qualsiasi cosa, e il $ significa la fine della stringa. Quindi, in pratica, si dice di prendere tutto dall'inizio alla fine della stringa e assegnare quel valore a $ 1.

Quindi se si digita www.example.com/tacos-are-good, quindi $1 = "tacos-are-good". Quindi la tua riscrittura finale sarà in realtà www.example.com/index.php/tacos-are-good.

Ecco un foglietto per ModRewrite che può essere di aiuto: http://www.addedbytes.com/cheat-sheets/mod_rewrite-cheat-sheet/

+2

Così entrambe le istanze di $ 1 si riferiscono allo stesso valore, allora? –

+1

Sì. Nel 'RewriteCond', si sta dicendo che eseguirà la riscrittura fino a quando $ 1 non è uguale ai file elencati a destra della condizione. – sbeliv01

6

$ 1 rappresenta la corrispondenza della prima serie di parentesi nell'espressione regolare che la segue. ($ 2 corrisponde alla seconda serie di parentesi - se specificata)

Ad esempio, l'espressione regolare corrisponde a tutto ciò che NON è "index.php" o "phpinfo.php", ecc. Quindi, la condizione di riscrittura viene passata se l'url richiesto non è uno di quelli, e la sezione corrispondente viene quindi passata al rewriterule.