我正在使用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错误。 我怎样才能使它工作?谢谢!
答案 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]