可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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???
回答1:
The routes config found in
config/routes.php
is your friend here.
A simple
$route['request-guide'] = "request_guide" ;
will do this for you.
回答2:
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;
回答3:
Code Ignitor 3 has this in built:
$route['translate_uri_dashes'] = FALSE;
Just change to TRUE
and you can use either _
or -
.
Documentation
回答4:
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).
回答5:
Have a look at Codeigniter's custom routing http://codeigniter.com/user_guide/general/routing.html
回答6:
$route['request-guide'] = "request_guide";
回答7:
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);
}
}
回答8:
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();
}