使用codeIgniter在URL中使用“ - ”链接

时间:2011-11-21 10:59:43

标签: .htaccess codeigniter url

我正在使用Codeigniter(第一次)。我希望页面的网址为“网页设计”,因此可以像/ web-design一样访问它。我知道用“ - ”创建一个类名是不可能的,所以我试图用.htaccess来实现它,就像这样:

RewriteEngine on

RewriteRule ^web-design$ index.php/webdesign [L]

RewriteCond $1 !^(index\.php|images|robots\.txt|assets)
RewriteRule ^(.*)$ index.php/$1 

但它不起作用。它给了我404错误。 我怎样才能使它工作?谢谢!

3 个答案:

答案 0 :(得分:2)

我使用扩展的Router类,它会将任何带有连字符的url转换为下划线。

例如 www.mysite / web-design 将被路由到* web_design *或 www.mysite / home /无论你想要什么/ 2 将被路由到到 home 控制器并运行* whatever_you_want *方法/函数,将 2 作为参数传递。

如果您正在使用Codeigniter 2,请将其放在/ application / core中(我确定您的配置中的前缀设置为 MY _

<?php if (! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Router extends CI_Router {

    function set_class($class) {
        $this->class = str_replace('-', '_', $class);
    }

    function set_method($method) {
        $this->method = str_replace('-', '_', $method);
    }

    function _validate_request($segments) {
        // Does the requested controller exist in the root folder?
        if (file_exists(APPPATH.'controllers/'.str_replace('-', '_', $segments[0]).EXT)) {
            return $segments;
        }
        // Is the controller in a sub-folder?
        if (is_dir(APPPATH.'controllers/'.$segments[0])) {       
            // Set the directory and remove it from the segment array
            $this->set_directory($segments[0]);
            $segments = array_slice($segments, 1);

            if (count($segments) > 0) {
                // Does the requested controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().str_replace('-', '_', $segments[0]).EXT)) {
                    show_404($this->fetch_directory().$segments[0]);
                }
            } else {
                $this->set_class($this->default_controller);
                $this->set_method('index');

                // Does the default controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT)) {
                    $this->directory = '';
                    return array();
                }

            }

            return $segments;
        }

        // Can't find the requested controller...
        show_404($segments[0]);
    }
}

请注意;这不是我的代码,但我不记得我发现它的位置,所以如果它是你的 - 感谢!

答案 1 :(得分:2)

您应该在CI中使用路由!这就是他们成功的原因。

这实际上很简单。

application/config/routes。php中将以下内容添加到$ route数组中:

$route['web-design'] = "webdesign";
$route['web-design/(:any)'] = "webdesign/$1";

然后你可以创建一个名为Webdesign的控制器;问题解决了 - 正确的方法。 无需扩展任何内容或创建其他重写规则。

答案 2 :(得分:1)

-是正则表达式中的特殊字符。尝试逃避它,如下:
 RewriteRule ^web\-design$ index.php/webdesign [L]