Как заменить подчеркивание в URL-адресе кодировки на тире? - PullRequest
20 голосов
/ 08 ноября 2011

Я хотел бы знать простейшее решение для изменения подчеркиваний моих URL кодигнитора на тире, по причинам SEO.

Мои контроллеры выглядят так:

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

Итак, чтобы перейти кна этой странице мне нужно перейти на:

www.domain.com/request_guide

Но я хочу быть более дружественным к SEO и использовать тире вместо подчеркивания, например:

www.domain.com/request-guide

У меня сложилось впечатлениечто функции codeigniter требуют подчеркивания (может быть неправильно).

В предыдущих проектах я просто использовал mod_rewrite, но я считаю, что эти действия могут быть выполнены с использованием маршрутов.

Какой самый простой способ для меняпереписать URL-адреса, заменив подчеркивания черточками ???

Ответы [ 8 ]

47 голосов
/ 12 декабря 2011

Это действительно зависит от вашего намерения.Если вы просто хотите изменить только одну страницу, то решение devrooms 'действительно является идеальным:

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

Но если вы хотите настроить поведение своего веб-сайта по умолчанию, вам следует расширитьбазовый класс Router (источник: [Использование дефисов вместо подчеркиваний в CodeIgniter] )

  1. Создайте новый файл в «application / core» и назовите его «MY_Router.php'
  2. Вставьте в него этот код:

    <?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));
        }
    
    }
    
    ?>
    

ОБНОВЛЕНИЕ (26 октября 2015 г.) : есть лучший способ сделать это в CodeIgniter 3, как упомянул @Thomas Wood:

$route['translate_uri_dashes'] = TRUE;
28 голосов
/ 12 января 2014

Код Ignitor 3 имеет это встроенный:

$route['translate_uri_dashes'] = FALSE;

Просто измените на TRUE, и вы можете использовать либо _ или -.

Документация

28 голосов
/ 08 ноября 2011

Конфигурация маршрутов, найденная в

config/routes.php

, является вашим другом здесь.

Простой

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

сделает это за вас.

8 голосов
/ 24 ноября 2015

Откройте application / config / rout.php и измените

$route['translate_uri_dashes'] = TRUE;

Вот что вам нужно сделать.

Теперь, когда вы заходите на www.domain.com/request-guide , он будет создавать экземпляр request_guide контроллера.

Он будет работать со всеми контроллерами, имя которых содержит _ (подчеркивание).

2 голосов
/ 08 ноября 2011
$route['request-guide'] = "request_guide";
2 голосов
/ 08 ноября 2011

Посмотрите на пользовательскую маршрутизацию Codeigniter http://codeigniter.com/user_guide/general/routing.html

1 голос
/ 24 июля 2014

Что вы можете сделать, это создать собственный хук (PST ... вам нужны базовые навыки CodeIgniter): для получения дополнительной информации о CodeIgniter Хуки - Расширение ядра платформы

/*
 * 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']);
}

Я назвалfile customhooks.php .

Затем добавьте это в файл hooks.php в application / config :

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

Вам потребуетсяотредактируйте файл application / config / config.php , чтобы включить хуки

$config['enable_hooks'] = TRUE;

ДОПОЛНИТЕЛЬНО:

, чтобы при использовании $ this-> uri-> uri_string () остается дефисом, выполните следующие действия: Создание классов базовой системы

class MY_URI extends CI_URI {

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

}
0 голосов
/ 27 ноября 2014

Вы можете использовать этот метод _remap () для обработки такого поведения.Поместите этот метод в свои контроллеры или создайте основной контроллер и поместите его в.

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...