Я хотел бы узнать простейшее решение для изменения подчеркивания моих кодовых символов для тире по соображениям 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'] = FALSE;
Код Ignitor 3 имеет это встроенное:
$route['translate_uri_dashes'] = FALSE;
Просто измените значение на TRUE
и вы можете использовать либо _
или -
.
Документация
Откройте приложение / config / routes.php и измените
$route['translate_uri_dashes'] = TRUE;
Это вам нужно.
Теперь, когда вы обращаетесь к http://www.domain.com/request-guide, он будет создавать экземпляр контроллера request_guide.
Он будет работать со всеми контроллерами с именем, содержащим _ (подчеркивание).
Взгляните на пользовательскую маршрутизацию Codeigniter http://codeigniter.com/user_guide/general/routing.html
$route['request-guide'] = "request_guide";
Что вы можете сделать, так это создать пользовательский крючок (PST … вам нужны базовые навыки CodeIgniter): для получения дополнительной информации о CodeIgniter Hooks – Расширение основного ядра
/* * 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']); }
с/* * 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 в application / 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, создав контроллеры с «_»,