2012-10-13 10 views
25

Voglio mod_rewrite un URL ad un'altra pagina, ma poi voglio anche qualsiasi stringa di query aggiunta per essere conservata.Come posso mod_rewrite e mantenere le stringhe di query?

RewriteEngine On 

#enforce trailing slashes 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !# 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ http://localhost/siteroot/$1/ [L,R=301] 

RewriteRule ^apps/([A-Za-z0-9-_]+)/?$ index.php&app=$1 

Quindi, se un utente visita apps/app1/, index.php?app=app1 è mostrato. Tuttavia, voglio essere in grado di conservare stringhe di query facoltative, in modo che la visita apps/app1/?variable=x restituisca index.php?app=app1&variable=x.

Quale regola/condizione mod_rewrite renderebbe questo possibile?

risposta

49

è necessario aggiungere il [QSA] flag ("stringa Query di accodamento")

RewriteRule ^apps/([A-Za-z0-9-_]+)/?$ index.php&app=$1 [L,QSA] 

per la pagina di redirect 301 con la bandiera [R] al contrario di riscritture interne come questo, la stringa di query viene automaticamente aggiunto. Tuttavia, devi forzarlo con [QSA] per la riscrittura interna.

+0

Grazie, non avevo realizzato che fosse così semplice. –

+1

+1 Accetto con @DanielOakey .. Stavo cercando di modificare qualcosa con regex e non funzionava .. –

+2

Per chiarire, non si tratta di riscritture o reindirizzamenti. http://httpd.apache.org/docs/current/rewrite/flags.html#flag_qsa dice: Quando l'URI di sostituzione contiene una stringa di query, il comportamento predefinito di RewriteRule è quello di eliminare la stringa di query esistente e sostituirla con quello appena generato. L'utilizzo del flag [QSA] fa sì che le stringhe di query vengano combinate. –