如何用破折号替换codeigniter url中的下划线?

时间:2011-11-08 14:49:27

标签: php codeigniter url-rewriting

由于原因,我想知道将codeigniter url的下划线更改为破折号的最简单的解决方案。

我的控制器看起来像:

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

因此,要浏览此页面,我必须转到:

www.domain.com/request_guide

但是我想要更加友好,并使用破折号代替下划线,如下:

www.domain.com/request-guide

我认为codeigniter功能需要下划线(可能是错误的)。

在之前的项目中,我只使用了mod_rewrite,但我相信可以使用路径执行这些操作。

我最简单的方法是用密码重写url替换下划线???

7 个答案:

答案 0 :(得分:47)

这实际上取决于你的意图。如果您只想更改一个页面,那么 devrooms '解决方案确实是完美的:

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

但是如果你想把它作为你网站的默认行为,你应该扩展你的核心路由器类(来源: [Using hyphens instead of underscores in 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));
        }
    
    }
    
    ?>
    
  3. 更新(2015年10月26日):在CodeIgniter 3中有更好的方法,正如@Thomas Wood所说:

    $route['translate_uri_dashes'] = TRUE;
    

答案 1 :(得分:28)

中的路线配置
config/routes.php

是你的朋友。

一个简单的

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

会为你做这件事。

答案 2 :(得分:28)

代码点火器3内置了这个:

$route['translate_uri_dashes'] = FALSE;

只需更改为TRUE即可使用_-

Documentation

答案 3 :(得分:2)

查看Codeigniter的自定义路由http://codeigniter.com/user_guide/general/routing.html

答案 4 :(得分:2)

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

答案 5 :(得分:1)

你可以做的是创建一个自定义钩子(PST ......你需要基本的CodeIgniter技能): 有关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']);
}

我将文件命名为 customhooks.php

然后将其添加到 application / config

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

您需要编辑 application / config / config.php 文件以启用挂钩

$config['enable_hooks'] = TRUE;

<强> EXTRA:

这样当您使用 $ this-&gt; uri-&gt; uri_string()时,它会保持连字符执行以下Creating Core System Classes

class MY_URI extends CI_URI {

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

}

答案 6 :(得分:0)

您可以使用此_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();
}