2010-01-21 5 views
8

Recentemente ho cambiato il mio CMS e desidero riscrivere alcuni dei miei URL in modo che corrispondano al nuovo formato di parametro URL/stringa di query.Riscrivere l'URL con parametri di stringa di query selezionati in .htaccess

Il vecchio URL era:

http://www.mysite.com/search.cgi?tag=foo&blog_id=bar&other=baz 

Il nuovo URL deve essere:

http://www.mysite.com/?s=foo 

In altre parole, ci sono stati diversi parametri di stringa di query nel vecchio formato, ma ho solo cura di riscrivere il tag param a s mantenendo lo stesso valore. Gli altri parametri dovrebbero essere scartati. Ovviamente l'ordine dei parametri non dovrebbe avere importanza. Inoltre non dovrebbe importare se il tag sia l'unico parametro o meno.

Qualche idea?

risposta

10

È possibile provare a utilizzare l'espressione regolare e il raggruppamento, se il server lo supporta. Se non mi sbaglio si deve riscrivere un solo parametro, penso che si potrebbe provare qualcosa di simile (se si utilizza Apache con mod_rewrite):

 
RewriteCond %{QUERY_STRING} ^.*(\btag\b=(\w+|&\w+;)+) 
RewriteRule ^(.+) /$1?%1 [L] 

Edit: Ho migliorato l'espressione regolare un po 'per corrisponde "tag" indipendentemente dalla sua posizione nella stringa di query e conserva sequenze di caratteri speciali come & Inoltre, dovrebbe evitare corrispondenze con parametri simili (ad es .: non corrisponderebbe a un parametro chiamato "alttag").

Modifica n. 2: Un'alternativa (soprattutto se è necessario filtrare diversi parametri) consiste nell'utilizzare un programma esterno per eseguire la riscrittura. Questa pagina: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap (in particolare la sezione "Programma di riscrittura esterna") contiene informazioni utili.

+0

Quindi il% 1 in RewriteRule riflette la corrispondenza dell'espressione regolare in RewriteCond? – lupefiasco

+2

Sì,% 1 viene utilizzato per fare riferimento a un gruppo in un RewriteCond, mentre $ 1 viene utilizzato per fare riferimento a un gruppo in una direttiva RewriteRule. –

+0

E come impostare il mio RewriteUrl in modo specifico per mappare /search.cgi? ... parte a /? ... – lupefiasco

2

Su un server web Apache, ponendo la seguente regola in .htaccess nella root del documento riscriverà gli URL come hai descritto:

RewriteCond %{QUERY_STRING} .*\btag=([^&]*).* 
RewriteRule ^search\.cgi /?s=%1 [R=302] 

La regola sopra utilizza un redirect 302, in modo che il browser utilizzato non "memorizza "la regola di reindirizzamento mentre stai testando e modificando la regola. Una volta terminato il test, cambia la [R] in [R = 301]. Un 301 è un reindirizzamento permanente ed è migliore per SEO.

+0

Questo dovrebbe reindirizzare con il parametro 's', e funzionerà come richiesto. – goodeye

+0

Proprio di nuovo a voi. +1 – goodeye

1

Ecco un'altra versione per ottenere in modo specifico cosa intendesse l'OP. @ La risposta di smhmic è vicina a questo. Preferisco solo l'inizio o la fine esplicita per trovare il parametro, piuttosto che l'approccio al confine delle parole. (La risposta accettata è troppo complicato, e ha alcuni problemi.)

RewriteCond %{QUERY_STRING} (?:^|&)tag=([^&]*) 
RewriteRule ^search\.cgi$ /?s=%1 [NC,R=302] 

Questo sta dicendo:
(?: ) non colgono questo come un certo numero%
^|& all'inizio della querystring o dopo una e commerciale (questo agisce come il limite della parola, ma in particolare per gli URL).
tag= il parametro che stiamo cercando.
( ) catturare questo, in% 1.
[^&]* zero o più caratteri non una e commerciale (e fermandosi alla e commerciale o in esecuzione fino alla fine).

+0

Questa è _almost_ esattamente la mia soluzione, ma la regex è più precisa. +1 –

Problemi correlati