2010-02-12 22 views

risposta

93
RewriteCond %{QUERY_STRING} book=(\w+)&page=(\d+) 
RewriteRule ^index.php /%1/%2? [L,R=301] 

Perché RewriteRule guarda solo al percorso (fino a, ma non incluso il punto di domanda), utilizzare RewriteCond per catturare i valori nella stringa di query.

noti che le partite da RewriteCond vengono acquisite in %1, %2, ecc, piuttosto che $1, $2, ecc

notare anche le ? a fine RewriteRule. Indica a mod_rewrite di non aggiungere la stringa di query originale al nuovo URL, quindi si finisce con /DesignPatterns/151 di /DesignPatterns/151?book=DesignPatterns&page=151.

I [L,R=301] bandiere fare due cose:

  1. L assicura che nessun altre regole che altrimenti potrebbero corrispondere saranno trattati (in altre parole, assicura questa è la "ultima" regola trasformati).
  2. R=301 fa in modo che il server invii una risposta di reindirizzamento. Invece di riscrivere, dice al client di provare di nuovo con il nuovo URL . Il =301 lo rende un permanent redirect, così che, tra le altre cose, i motori di ricerca sapranno sostituire il vecchio URL con il nuovo URL nei loro indici.
+10

+1 Mi piace quando viene fornita una spiegazione completa con una risposta –

+1

Probabilmente vuoi anche il flag [L] quando hai più regole di riscrittura. Il flag [L] interrompe l'elaborazione dopo che la regola è stata abbinata e il flag [R] NON lo include implicitamente. – TheJosh

+1

I $ vs% mi stavano uccidendo. Non ne avevo idea. Grazie! – keithwyland

Problemi correlati