2011-10-04 8 views
8

Me gustaría redirigir cualquier solicitud que contenga guiones bajos a la misma url, pero con guiones reemplazando las direcciones URL. He visto un montón de foros sugieren que hago algo como esto:En htaccess, me gustaría reemplazar guiones bajos con guiones y luego redirigir al usuario la nueva url

(repetición de una versión incrementada de este RewriteRule hasta un tropecientos)

rewriteRule ^([^_]*)_([^_]*)_([^_]*)_(.*)$ http://example.com/$1-$2-$3-$4 [R=301,L] 
rewriteRule ^([^_]*)_([^_]*)_(.*)$ http://example.com/$1-$2-$3 [R=301,L] 
rewriteRule ^([^_]*)_(.*)$ http://example.com/$1-$2 [R=301,L] 

Mi solución actual es en php (que funciona bien) :

if(preg_match('/[_]+/', $_SERVER['REQUEST_URI'])){ 
    $redirectUrl = preg_replace('/[_]+/','-', $_SERVER['REQUEST_URI']); 
    header('Location: '. $redirectUrl , TRUE, 301); 
    return; 
} 

Pero, prefiero no usar PHP & lugar mantenerlo en mi archivo .htaccess sin tener que repetir el primer RewriteRule una y otra vez con el fin de anticipar cuántos guiones podría ser cada URL. ¿Pensamientos? ¿Hay alguna manera de hacer esto sin repetir el rewriteRule incrementado?

----- ----- edición

Mi htaccess actual es sólo el estándar de WordPress uno, que es continuación:

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase/
RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 
+0

Esta es la única manera de que me verlo funcionando, no tiene Reemplazos en la reescritura mod, solo reescribiendo reglas con patrones coincidentes. –

Respuesta

4

Véase el "Siguiente" bandera Directiva/reescritura, lo que hace que el conjunto de reglas a ser reevaluado a partir de la primera regla: http://httpd.apache.org/docs/current/rewrite/flags.html#flag_n

Algo como esto podría funcionar:

RewriteRule (.*)_(.*) $1-$2 [N] 
+1

¡Probado, funciona! +1 por ingenio. –

+0

@llmari Karonen - Tengo curiosidad, ¿qué url usaste para probar esto? – Schoffelman

+0

Terminé usando esto como la regla RewriteRule^([^ _] *) _ (. *) $/$ 1- $ 2 [R = 301, L] – Schoffelman

0

¿Qué hay de la combinación de la 2. Tener una regla de reescritura única que vuelve a escribir en un script PHP que realiza la sustitución y la redirección. De esta forma evitará tener múltiples reglas de reescritura, podrá manejar cualquier número de guiones bajos y solo invocará la redirección de PHP cuando sea necesario.

Cuestiones relacionadas