2009-08-11 8 views
17

He creado un nuevo sitio PHP para un cliente y quiero redireccionar los resultados de Google de la clasificación anterior a la nueva.Apache Redirect 301 falla al usar los parámetros GET, como? Blah =

He puesto varias docenas de Redirect 301 en un .htaccess en el documentroot, y aunque algunas funcionan bien, tengo problemas con muchas otras.

Esto funciona bien:

Redirect 301 /nl/flash/banner_new.swf http://www.example.com/actueel/nieuws.html?action=show&f_id=152 

Esto no funciona! (Que conduce a un 404 desde la redirección simplemente se omite):

Redirect 301 /nl/index.php?mID=24511&subID=0 http://www.example.com/solutions/printsolutions.html 
Redirect 301 /nl/index.php?mID=24512&subID=0 http://www.example.com/support/koppeling-met-omgeving.html 

Las redirecciones se mezclan en el archivo .htaccess, y sólo las redirecciones con parámetros GET parecen fallar.

¿Hay una solución? Ignorar los redireccionamientos fallidos no es una opción para el cliente. Gracias por tus pensamientos

Respuesta

15

Mientras Gumbo's answer's razonamiento era correcto, no pude conseguir su RewriteRule para trabajar.

Añadiendo otra RewriteCond lo hizo. Lo siguiente fue probado y funciona bien.

RewriteCond %{REQUEST_URI} /nl/index.php$ 
RewriteCond %{QUERY_STRING} ^mID=24511&subID=0$ 
RewriteRule ^.*$ http://www.example.com/solutions/printsolutions.html [L,R=301] 
+2

El patrón real para 'RewriteRule' depende de si se usa en la configuración del servidor o en un archivo .htaccess y donde se encuentra el archivo .htaccess. – Gumbo

12

Redirect qué funcionan sólo en las rutas de URL:

El viejo URL-path es un camino entre mayúsculas y minúsculas (% -decoded) que comienza con una barra. [...]

Así que la consulta de URL (la parte después de la primera ? hasta el primer # después) no está activada.

Pero se puede utilizar para hacer eso mod_rewrite:

RewriteCond %{QUERY_STRING} ^mID=24511&subID=0$ 
RewriteRule ^nl/index\.php$ http://www.example.com/solutions/printsolutions.html [L,R=301] 
RewriteCond %{QUERY_STRING} ^mID=24512&subID=0$ 
RewriteRule ^nl/index\.php$ http://www.example.com/support/koppeling-met-omgeving.html [L,R=301] 
12

Coincidiendo con tanto Gumbo y respuestas de Martijn ... pero:

error tipográfico en Martijn de, no debería haber ser "^" para iniciar la expresión regular para la condición REQUEST_URI:

RewriteCond %{REQUEST_URI} ^/nl/index.php$ 

Yo también solo pude obtener el de Martijn, no el de Gumbo, para trabajar donde estaba mi archivo .htaccess.

Además, si no desea que la cadena de parámetros se transmita con la reescritura, debe agregar un "?" en el final de la URL:

RewriteRule ^.*$ http://www.example.com/solutions/printsolutions.html? [L,R=301] 

De lo contrario, siguiendo el código de Martijn, se lee "si su URL es /nl/index.php?mID=24511 & subid = 0 entonces redirigir a http://www.example.com/solutions/printsolutions.html?mID=24511&subID=0 con una redirección permanente 301 encabezado y no procesar más reglas en esta URL "

Esto puede ser o no lo que desea, y para ser justos como una regla general si no se entienden los parámetros, simplemente se ignorarán sin causar ningún daño, por lo probablemente no importará.Sin embargo, si quieres redirigir a un humano a una nueva página y quieres "URL bonitas", entonces es preferible quitar la cadena de parámetros, así que pega el "?" al final de la URL de destino.

+0

Excelente información sobre cómo suprimir el pase de parámetro de cadena GET predeterminado con el "?" firmar al final ... estaba buscando eso. –

+1

el? el comentario es una gran adición a esta publicación. –

Cuestiones relacionadas