I would like to know the simplest solution to changing the underscores of my codeigniter urls to dashes, for seo reasons.
My controllers look like:
public function request_guide() {
...Load view etc...
}
So to browse to this page I would have to go to:
www.domain.com/request_guide
But I want to be more seo friendly and use dashes instead of underscores, like so:
www.domain.com/request-guide
I am under the impression that codeigniter functions require underscores (might be wrong).
In previous projects I have simply used mod_rewrite but I believe that these actions can be performed using routes.
What is the easiest way for me to rewrite the urls replacing the underscores with dashes???
The routes config found in
config/routes.php
is your friend here.
A simple
$route['request-guide'] = "request_guide" ;
will do this for you.
It really depends on your intention. If you just want to change only one page, then devrooms' solution is the perfect one indeed:
$route['request-guide'] = "request_guide";
But if you want to make this your website's default behavior you should extend your core Router class like this (source: [Using hyphens instead of underscores in CodeIgniter])
- Make a new file in 'application/core' and name it 'MY_Router.php'
Insert this code in it:
<?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)); } } ?>
UPDATE (Oct 26, 2015): There's a better way to do this in CodeIgniter 3, as @Thomas Wood mentioned:
$route['translate_uri_dashes'] = TRUE;
Code Ignitor 3 has this in built:
$route['translate_uri_dashes'] = FALSE;
Just change to TRUE
and you can use either _
or -
.
Open application/config/routes.php and change
$route['translate_uri_dashes'] = TRUE;
That is it you need to do.
Now when you access www.domain.com/request-guide, it will instantiate request_guide controller.
It will work with all controllers with name containing _ (underscore).
Have a look at Codeigniter's custom routing http://codeigniter.com/user_guide/general/routing.html
$route['request-guide'] = "request_guide";
What you could do is create a custom hook (PST... you need basic CodeIgniter skills): for more information regarding CodeIgniter Hooks - Extending the Framework Core
/*
* 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']);
}
I named the file customhooks.php.
Then add this to the hooks.php file in application/config:
$hook['pre_system'] = array(
'class' => '',
'function' => 'prettyurls',
'filename' => 'customhooks.php',
'filepath' => 'hooks',
'params' => array()
);
You will need to edit your application/config/config.php file to enable hooks
$config['enable_hooks'] = TRUE;
EXTRA:
so that when you use $this->uri->uri_string() it stays hyphenated do the following Creating Core System Classes
class MY_URI extends CI_URI {
function uri_string() {
return str_replace('_', '-', $this->uri_string);
}
}
You can use this _remap() method to handle such behavior. Place this method in your controllers or create a core controller and place it in.
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();
}
来源:https://stackoverflow.com/questions/8052245/how-to-replace-underscores-in-codeigniter-url-with-dashes