Come posso abbinare le variabili stringa di query con mod_rewrite?

Supponiamo di avere URL con parametri di stringa di query come questi:

/index.php?book=DesignPatterns&page=139 /index.php?book=Refactoring&page=285 

Usando mod_rewrite , come posso reindirli a URL SES come questi?

 /DesignPatterns/139 /Refactoring/285 

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

Poiché RewriteRule esamina solo il percorso (fino a non includere il punto interrogativo), utilizzare RewriteCond per acquisire i valori nella stringa di query.

Tieni presente che le corrispondenze di RewriteCond vengono acquisite in %1 , %2 , ecc., Anziché $1 , $2 , ecc.

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

Le bandiere [L,R=301] fanno due cose:

  1. L assicura che non vengano elaborate altre regole che potrebbero altrimenti corrispondere (in altre parole, garantisce che questa sia l’ultima regola elaborata).
  2. R=301 fa in modo che il server invii una risposta di reindirizzamento. Invece di riscrivere, dice al client di riprovare con il nuovo URL. Il =301 rende un reindirizzamento permanente , così che, tra le altre cose, i motori di ricerca sapranno sostituire il vecchio URL con il nuovo URL nei loro indici.

Se la situazione fosse viceversa rispetto alla domanda originale, sarebbe: RewriteCond% {QUERY_STRING} (\ w +) RewriteRule ^ index.php? Book =% 1? [L, R = 301]

cambia questo / DesignPatterns / 139 in questo /index.php?book=DesignPatterns&page=139