mod_rewrite: reemplazar guiones bajos con guiones

Estoy revelando mi ignorancia embarazosa de REGEX-fu aquí, pero: actualmente tengo un sitio web donde una carga de las URL de los artículos se escribe como “article_name”, mientras que las más nuevas se escriben como “article-name”.

Quiero moverlos todos al uso de guiones, entonces ¿hay alguna expresión regular que pueda usar para volver a escribir las URL anteriores en sus equivalentes más nuevos?

¡Agradeciendotelo de antemano!

Primero, debe lograr consistencia en las URL existentes. Básicamente, debe normalizar todos los nombres existentes para usar siempre guiones. Ok, has hecho eso.

Estamos comenzando con la siguiente suposición:

La URL es más o menos de la forma:

 http://example.com/articles/what-ever/really-doesnt_matter/faulty_article_name

donde solo deben reescribirse las URL bajo /articles , y solo la parte /faulty_article_name debe ser desinfectada.

Muy actualizado, con algo que realmente funciona

Para Apache:

 RewriteEngine On RewriteRule ^(/?articles/.*/[^/]*?)_([^/]*?_[^/]*)$ $1-$2 [N] RewriteRule ^(/?articles/.*/[^/]*?)_([^/_]*)$ $1-$2 [R=301] 

Eso generalmente está inspirado en la respuesta de GApple.

El primero /? asegura que este código se ejecutará en ambos archivos vhost confs y .htaccess . Este último no espera una barra diagonal.

Luego agrego los articles/ partes para asegurarme de que las reglas solo se apliquen a las URL dentro de /articles .

Luego, si bien tenemos al menos dos guiones bajos en la URL, seguimos avanzando por las reglas. Cuando terminamos con un solo guión bajo restante, la segunda regla se activa, la reemplaza con un guion y hace un redireccionamiento permanente.

Uf.

Prueba esto:

 RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N] RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301] 

La primera regla reemplaza un guión bajo a la vez hasta que quede uno o menos. La última regla reemplazará el último underscrore y hará un redireccionamiento externo.

Un posible enfoque diferente para pensar:

Supongo que su “formato anterior” y su “nuevo formato” estarán en diferentes directorios para esta idea; si no lo están, es posible que desee considerar hacer que el nuevo formato tenga un nombre de directorio diferente.

Por ejemplo:

  http://site.com/articles/2008/12/31/new_years_celebration 
  http://site.com/article/2008/12/31/new-years-celebration 

En ese caso, podría usar mod_rewrite para detectar cualquier cosa en el “directorio anterior” y redirigirlo a un ” redirector.php “.

Aunque, pensándolo bien, tu mod_rewrite podría buscar algo como esto:

  RedirectRule /articles/(.*_.*) /redirector.php?article=$1 

Emparejar cualquier cosa con un _ y enviarlo a través del redirector.

Dentro de redirector.php puedes obtener $_SERVER['REQUEST_URI'] y usar herramientas como preg_replace e incluso consultas de bases de datos para encontrar la URL correcta para redirigirlas, así como estudiar el número de visitas a URLs antiguas.

Aquí hay un método: http://yoast.com/apache-rewrite-dash-underscore/

Básicamente, separa la url en tokens a cada lado del guión bajo y vuelve a escribir los tokens con el guión bajo reemplazado. El problema es que solo reemplaza un guión bajo a la vez; redirigirá a una URL más cercana pero no del todo correcta, que volverá a redirigir a una URL aún más cercana, pero posiblemente aún no correcta …

Sugiere corregir los redireccionamientos múltiples al tener varias condiciones y reglas de reescritura con sucesivamente más guiones bajos y tokens, pero esto requeriría tantas condiciones y reglas como haya subrayado en su título más largo.

Sin embargo, asegúrese de agregar cualquier calificador si puede, ya que la regla puede reemplazar las rutas que no desea cambiar (por ejemplo, archivos de imágenes) tal como están.

¿Cómo reescribirá mod cómo se supone que es la url real? Puede volver a escribir todos los artículos para usar el guión bajo o el guión, pero no hay forma de que mod_rewrite diga si existe una nueva ubicación.

Por ejemplo,

 / I_Like_Bees se almacena como / path / i_like_bees
 / I-like-flowers se almacena como / path / i-like-flowers

Quieres que i-like-bees reescriba a i_like_bees .

  • Si reescribe guiones bajos a guiones, no se encontrarán i_like_bees
  • si reescribe guiones para subrayar, no se encontrarán i-like-flowers

Si almacenó todos sus artículos consistentemente, podría hacer que una regla de reescritura funcione fácilmente. En su lugar, probablemente tenga que escribir un script para verificar la existencia de directorios y hacer un redireccionamiento 301 al lugar correcto.

Intereting Posts