Ответ 1
Конфигурация маршрутов, найденная в
config/routes.php
ваш друг здесь.
Простой
$route['request-guide'] = "request_guide" ;
сделает это за вас.
Я хотел бы узнать простейшее решение для изменения подчеркивания моих кодовых символов для тире по соображениям SEO.
Мои контроллеры выглядят так:
public function request_guide() {
...Load view etc...
}
Итак, чтобы перейти к этой странице, мне нужно было бы перейти к:
www.domain.com/request_guide
Но я хочу быть более ориентированным на SEO и использовать тире вместо подчеркиваний, например:
www.domain.com/request-guide
У меня создается впечатление, что функции codeigniter требуют подчеркивания (возможно, ошибочные).
В предыдущих проектах я просто использовал mod_rewrite, но считаю, что эти действия могут быть выполнены с использованием маршрутов.
Что является самым простым способом для меня переписать URL-адреса, заменяя символы подчеркивания штрихами?
Конфигурация маршрутов, найденная в
config/routes.php
ваш друг здесь.
Простой
$route['request-guide'] = "request_guide" ;
сделает это за вас.
Это действительно зависит от вашего намерения. Если вы просто хотите изменить только одну страницу, то решение devrooms является идеальным:
$route['request-guide'] = "request_guide";
Но если вы хотите сделать это своим поведением по умолчанию, вы должны расширить свой основной класс Router следующим образом (source: [Использование дефиса вместо подчеркивания в CodeIgniter ])
Вставьте в него этот код:
<?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;
Код Ignitor 3 имеет это встроенное значение:
$route['translate_uri_dashes'] = FALSE;
Просто измените на TRUE
, и вы можете использовать либо _
, либо -
.
Откройте приложение /config/routes.php и измените
$route['translate_uri_dashes'] = TRUE;
Это вам нужно сделать.
Теперь, когда вы обращаетесь к www.domain.com/request-guide, он будет создавать экземпляр контроллера request_guide.
Он будет работать со всеми контроллерами с именем, содержащим _ (подчеркивание).
Взгляните на пользовательскую маршрутизацию Codeigniter http://codeigniter.com/user_guide/general/routing.html
$route['request-guide'] = "request_guide";
Что вы можете сделать, так это создать пользовательский крючок (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']);
}
Я назвал файл customhooks.php.
Затем добавьте это в файл hooks.php в приложении /config :
$hook['pre_system'] = array(
'class' => '',
'function' => 'prettyurls',
'filename' => 'customhooks.php',
'filepath' => 'hooks',
'params' => array()
);
Вам нужно будет отредактировать файл application/config/config.php, чтобы включить hooks
$config['enable_hooks'] = TRUE;
EXTRA
так что, когда вы используете $this- > uri- > uri_string(), он остается в переносе, сделайте следующее Создание основных системных классов
class MY_URI extends CI_URI {
function uri_string() {
return str_replace('_', '-', $this->uri_string);
}
}
Вы можете использовать этот метод _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();
}
goto system\core\Router.php и следующее в функции _set_request как первая строка
$segment = str_replace ('-', '_', $сегменты);
это заменит все '-' в url на '_', чтобы вы могли включить '-' в свой url, создав контроллеры с помощью '_'