2010-01-21 22 views
8

Recientemente cambié mi CMS y quiero reescribir algunas de mis URL para que coincidan con el nuevo formato de parámetro de cadena de URL/consulta.Reescribiendo URL con los parámetros de cadena de consulta seleccionados en .htaccess

La dirección de edad fue:

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

La nueva URL debe ser:

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

En otras palabras, hubo varios parámetros de cadena de consulta en el formato antiguo, pero sólo se preocupan de reescribir la etiqueta param a s manteniendo el mismo valor. Los otros parámetros deben descartarse. Por supuesto, el orden de los parámetros no debería importar. Tampoco debería importar si la etiqueta es el único parámetro o no.

¿Alguna idea?

Respuesta

10

Puede intentar utilizar la expresión regular y la agrupación, si su servidor lo admite. Si no me equivoco hay que volver a escribir sólo un parámetro, supongo que se podría intentar algo así como (si está utilizando Apache con mod_rewrite):

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

Editar: que mejoraron la expresión regular un poco para emparejar "etiqueta" independientemente de su posición en la cadena de consulta y para conservar secuencias de caracteres especiales como & Además, debe evitar coincidencias con parámetros similares (es decir: no concuerda con un parámetro llamado "alttag").

Edit # 2: Una alternativa (especialmente si tiene que filtrar varios parámetros) es utilizar un programa externo para hacer la reescritura. Esta página: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap (en particular, la sección "Programa de reescritura externa") contiene información útil.

+0

Entonces, el% 1 en RewriteRule refleja la coincidencia de expresión regular en RewriteCond? – lupefiasco

+2

Sí,% 1 se usa para referirse a un grupo en RewriteCond, mientras que $ 1 se usa para referirse a un grupo en una directiva RewriteRule. –

+0

¿Y cómo podría configurar mi RewriteUrl específicamente para asignar la parte /search.cgi? ... a /? ... – lupefiasco

2

En un servidor web Apache, colocando la siguiente regla en .htaccess en la raíz del documento volverá a escribir las direcciones URL como usted la describe:

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

La regla anterior utiliza una redirección 302, por lo que su navegador no "memorizar "la regla de redireccionamiento mientras pruebas y modificas la regla". Una vez que haya terminado la prueba, cambie la [R] a [R = 301]. A 301 es una redirección permanente, y es mejor para SEO.

+0

Esto debería redirigir con el parámetro 's', y funcionará según lo solicitado. – goodeye

+0

Directo a usted. +1 – goodeye

1

Aquí hay otra versión para obtener específicamente lo que significaba el OP. La respuesta de @ smhmic está cerca de esto. Solo prefiero el comienzo o el signo explícito para encontrar el parámetro, en lugar del enfoque de límite de palabras. (La respuesta aceptada es demasiado complicado, y tiene algunos problemas.)

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

Esto es decir:
(?: ) no captan esto como un número
% ^|& al comienzo de la cadena de consulta o después de un signo (este actúa como el límite de palabras, pero específicamente para las URL).
tag= el param que estamos buscando.
( ) capture esto, en% 1.
[^&]* cero o más caracteres, no un ampersand (y detenerse en ampersand o ejecutarse hasta el final).

+0

Esto es casi la solución exacta, pero la expresión regular es más precisa. +1 –

Cuestiones relacionadas