¿Cómo reemplazar guiones bajos en la URL de Codeigniter con guiones?

Me gustaría saber la solución más simple para cambiar los guiones bajos de mis URL de codeigniter a guiones, por razones de SEO.

Mis controladores se ven así:

public function request_guide() {
...Load view etc...
}

Entonces, para navegar a esta página, tendría que ir a:

www.domain.com/request_guide

Pero quiero ser más amigable con SEO y usar guiones en lugar de guiones bajos, así:

www.domain.com/request-guide

Tengo la impresión de que las funciones de codeigniter requieren guiones bajos (podría estar mal).

En proyectos anteriores simplemente usé mod_rewrite pero creo que estas acciones se pueden realizar usando rutas.

¿Cuál es la forma más fácil para mí de reescribir las URL reemplazando los guiones bajos con guiones ???

preguntado el 08 de noviembre de 11 a las 14:11

request-guide no es más amigable con el SEO que request_guide. -

Si piensa en ello, coincidiría con el nombre de una clase, donde un guión no es válido; de hecho, necesitaría escribir el nombre de la clase (o método) como "request-guide", que es una sintaxis php inválida. Realice un cambio de ruta como se sugiere en las respuestas a continuación:

Tenía la impresión de Google de que clasifican los guiones como espacios y las palabras que contienen guiones bajos como una palabra completa. -

@Ianzz request-guide es MUCHO más amigable con el SEO que request_guide. Los guiones son extremadamente amigables con el SEO en las URL y Google los interpreta como separadores de palabras. -

8 Respuestas

Realmente depende de tu intención. Si solo desea cambiar una página, entonces devrooms'La solución es la perfecta de hecho:

$route['request-guide'] = "request_guide";

Pero si desea que este sea el comportamiento predeterminado de su sitio web, debe extender su clase de enrutador principal de esta manera (fuente: [Uso de guiones en lugar de guiones bajos en CodeIgniter])

  1. Cree un nuevo archivo en 'application / core' y asígnele el nombre 'MY_Router.php'
  2. Inserte este código en él:

    <?php
    
    defined('BASEPATH') || exit('No direct script access allowed');
    
    class MY_Router extends CI_Router {
    
        function _set_request ($seg = array())
        {
            // The str_replace() below goes through all our segments
            // and replaces the hyphens with underscores making it
            // possible to use hyphens in controllers, folder names and
            // function names
            parent::_set_request(str_replace('-', '_', $seg));
        }
    
    }
    
    ?>
    

ACTUALIZACIÓN (26 de octubre de 2015): Hay una mejor manera de hacer esto en CodeIgniter 3, como mencionó @Thomas Wood:

$route['translate_uri_dashes'] = TRUE;

Respondido el 20 de enero de 18 a las 05:01

esto no parece funcionar ahora. creó el archivo como arriba pero no pasa nada. ¿Algunas ideas? - LiveEn

Pensé que estaban forzando etiquetas PHP cerradas en PHP6. - marksyzm

@ christopher-thomas ¡Gracias por la sugerencia! Creo que la solución es escribir demasiado para hacer algo que podría hacerse con una sola línea de código. - Stan

lo bueno del enlace que sugerí, es que funciona SOLO en clases y métodos, por lo que no toca las otras partes de la URL, por ejemplo, si tiene parámetros al final con - en ellos, conviértase también. De esta manera solo se convierten las partes que se necesitan, por lo que incluso si son unas pocas líneas más, en realidad es más específico y en general más completo. Christopher Thomas

¿No debería establecerse en TRUE? - CodeGodie

Code Ignitor 3 tiene esto incorporado:

$route['translate_uri_dashes'] = FALSE;

Solo cambia a TRUE y puedes usar _ or -.

Documentación

Respondido 12 Oct 15, 01:10

Es genial saberlo. ¡Gracias! - Stan

No estoy seguro, pero todavía existe en el documentación (justo en la parte inferior) - Thomas Wood

Esto parece no estar trabajando si tiene controladores dentro de directorios o carpetas como application/controllers/my_folder/About_us.php. - CodeGodie

La configuración de rutas encontrada en

config/routes.php

es tu amigo aquí.

Un simple

$route['request-guide'] = "request_guide" ;

hará esto por ti.

respondido 08 nov., 11:18

Abra la aplicación / config / routes.php y cambie

$route['translate_uri_dashes'] = TRUE;

Ahora cuando accedes www.domain.com/**request-guide**, creará una instancia request_guide controlador.

Funcionará con todos los controladores cuyo nombre contenga _ (subrayado).

Respondido 16 Feb 21, 11:02

Eche un vistazo al enrutamiento personalizado de Codeigniter http://codeigniter.com/user_guide/general/routing.html

respondido 08 nov., 11:18

$route['request-guide'] = "request_guide";

respondido 08 nov., 11:18

Lo que podría hacer es crear un gancho personalizado (PST ... necesita habilidades básicas de CodeIgniter): para obtener más información sobre CodeIgniter Hooks: ampliación del núcleo del marco

/*
 * the hooks must be enabled from the config file
 * replace underscore with dashes (hyphens) for SEO
 */

function prettyurls() {
    if (is_array($_GET) && count($_GET) == 1 && trim(key($_GET), '/') != '') {
        $newkey = str_replace('-', '_', key($_GET));
        $_GET[$newkey] = $_GET[key($_GET)];
        unset($_GET[key($_GET)]);
    }
    if (isset($_SERVER['PATH_INFO']))
        $_SERVER['PATH_INFO'] = str_replace('-', '_', $_SERVER['PATH_INFO']);
    if (isset($_SERVER['QUERY_STRING']))
        $_SERVER['QUERY_STRING'] = str_replace('-', '_', $_SERVER['QUERY_STRING']);
    if (isset($_SERVER['ORIG_PATH_INFO']))
        $_SERVER['ORIG_PATH_INFO'] = str_replace('-', '_', $_SERVER['ORIG_PATH_INFO']);
    if (isset($_SERVER['REQUEST_URI']))
        $_SERVER['REQUEST_URI'] = str_replace('-', '_', $_SERVER['REQUEST_URI']);
}

Nombré el archivo customhooks.php.

Luego agregue esto al archivo hooks.php en aplicación / configuración:

$hook['pre_system'] = array(
    'class' => '',
    'function' => 'prettyurls',
    'filename' => 'customhooks.php',
    'filepath' => 'hooks',
    'params' => array()
);

Deberá editar su application / config / config.php archivo para habilitar ganchos

$config['enable_hooks'] = TRUE;

EXTRA:

para que cuando uses $ esto-> uri-> uri_string () permanece con guión haz lo siguiente Creación de clases del sistema principal

class MY_URI extends CI_URI {

    function uri_string() {
        return str_replace('_', '-', $this->uri_string);
    }

}

Respondido 24 Jul 14, 16:07

Puede usar este método _remap () para manejar tal comportamiento. Coloque este método en sus controladores o cree un controlador central y colóquelo.

public function _remap($method, $params = array()){
    if(method_exists($this, $method)){
        return call_user_func_array(array($this, $method), $params);
    }else{
        $method = str_replace("-", "_", $method);
        if(method_exists($this, $method)){
            return call_user_func_array(array($this, $method), $params);
        }
    }
    show_404();
}

respondido 27 nov., 14:15

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.