301 Redirigir para reemplazar todos los espacios por guiones

Así que aquí está mi problema. Me hice cargo de un sitio que tiene un grupo de páginas indexadas que tienen% 20 indexado en Google. Esto se debe simplemente a que la persona decidió usar el nombre de la etiqueta como título y URL slug. Entonces, las URL fueron algo como esto:

http://www.test.com/tag/bob%20hope http://www.test.com/tag/bob%20hope%20is%20funny 

He agregado un nuevo campo para la barra url y la cadena reemplazó todos los espacios con guiones. Si bien no tengo problemas para vincularme a estas páginas nuevas y obtener los datos, necesito redireccionar 301 las URL antiguas a las nuevas URL, que serían algo así como:

 http://www.test.com/tag/bob-hope http://www.test.com/tag/bob-hope-is-funny 

Por lo tanto, debe ser capaz de dar cuenta de múltiples espacios. ¿Alguna pregunta? 🙂

Use estas reglas en su archivo .htaccess:

 Options +FollowSymlinks -MultiViews RewriteEngine on RewriteBase / # keep replacing space to hyphen until there is no space use internal rewrite RewriteRule ^([^\s%20]*)[\s%20]+(.*)$ $1-$2 [E=NOSPACE:1] # when there is no space make an external redirection RewriteCond %{ENV:NOSPACE} =1 RewriteRule ^([^\s%20]+)$ $1 [R=301,L] 

Esto reemplazará todos los caracteres de espacio ( \s o %20 ) por guiones -

Entonces, un URI de /tag/bob%20hope%20is%20funny se convertirá en /tag/bob-hope-is-funny con 301

Breve explicación: si hay más de 1 espacio en el URI, entonces 1st RewriteRule se activa recursivamente reemplazando cada carácter del espacio con guión - hasta que no quede espacio. Esta regla solo se reescribirá internamente.

Una vez que no queda espacio, 2 RewriteRule se activa y solo usa una 301 redirect para el URI convertido.

Basándose en la respuesta de @anhubhava, está cerca, pero también coincidirá con%, 2 o 0 en la URL, y puede provocar un bucle en Apache 2.2 si no usa el parámetro DPI. El script completo debería verse así:

 Options FollowSymlinks MultiViews RewriteEngine on RewriteBase / # keep replacing space to hyphen until there is no space use internal rewrite RewriteRule ^([^\s%20]*)(?:\s|%20)+(.*)$ $1-$2 [N,E=NOSPACE:1,DPI] # when there is no space make an external redirection RewriteCond %{ENV:NOSPACE} =1 RewriteRule ^([^\s%20]+)$ $1 [R=301,L] 

También agregué el parámetro N (Siguiente) ya que esto fuerza a las reglas a ser reevaluadas desde el comienzo directamente después de esta regla si coincide. Si esto no está allí, puede tener problemas si usa apache como proxy inverso, ya que es poco probable que llegue al final de las reescrituras antes de que ocurra algo más.