Codeigniter 查询字符串 URL 问题
Codeigniter Query Strings URL Issue
我已经设置了如下 url 的项目。
index.php?c=controllerName&m=methodName
上面的参数 url 如下所示。
index.php?c=controllerName&m=methodName&selDeg=manager
我想像下面那样为我新创建的模块使用 url。
admin/Items/1
但是想要使用第一种类型 url,因为它用于以前开发的模块。
是否可以将 url 与 index.php
用于旧模块,而将 index.php
用于新模块。
您可以像这样准备您的配置:
$config['base_url'] = 'your_base_url';
$config['index_page'] = ''; // empty string
$config['enable_query_strings'] = FALSE; // keep it to default FALSE, you can use it even without enabling it here
你的 .htaccess
是这样的:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/ [L]
我想就是这样,现在您可以像这样同时使用 segments
和 query_strings
:
http://localhost/codeigniter/?c=welcome&m=index
http://localhost/codeigniter/welcome/index
http://localhost/codeigniter/index.php/welcome/index
http://localhost/codeigniter/index.php?c=welcome&m=index
http://localhost/codeigniter/index.php/?c=welcome&m=index
我已经在我的环境中测试过,它工作得很好。
编辑:在我的 codeigniter 模板中,我扩展了我的核心路由器并稍微更改了 _set_routing()
方法,如下所示:
当然更改核心系统是一个不好的做法,所以你需要扩展核心路由器文件并在application/core
下创建MY_Router.php
并使其扩展CI_Router
就像这个:
class MY_Router extends CI_Router
{
protected function _set_routing()
{
if (file_exists(APPPATH.'config/routes.php'))
{
include(APPPATH.'config/routes.php');
}
if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/routes.php'))
{
include(APPPATH.'config/'.ENVIRONMENT.'/routes.php');
}
if (isset($route) && is_array($route))
{
isset($route['default_controller']) && $this->default_controller = $route['default_controller'];
isset($route['translate_uri_dashes']) && $this->translate_uri_dashes = $route['translate_uri_dashes'];
unset($route['default_controller'], $route['translate_uri_dashes']);
$this->routes = $route;
}
$_c = trim($this->config->item('controller_trigger'));
if ( ! empty($_GET[$_c]))
{
$this->uri->filter_uri($_GET[$_c]);
$this->set_class($_GET[$_c]);
$_f = trim($this->config->item('function_trigger'));
if ( ! empty($_GET[$_f]))
{
$this->uri->filter_uri($_GET[$_f]);
$this->set_method($_GET[$_f]);
}
$this->uri->rsegments = array(
1 => $this->class,
2 => $this->method
);
}
else
{
if ($this->uri->uri_string !== '')
{
$this->_parse_routes();
}
else
{
$this->_set_default_controller();
}
}
}
}
现在您拥有了两全其美的优势,您将保持您的细分及其好东西不变,但将始终寻找 get c=&m=
,我希望它足够清楚。
我们将所有内容都保留为默认值,并使其使用 c
和 m
检查获取请求,这与 enable_query_strings
所做的非常相似,但没有启用它并弄乱任何东西以继续工作按原样细分..
我已经设置了如下 url 的项目。
index.php?c=controllerName&m=methodName
上面的参数 url 如下所示。
index.php?c=controllerName&m=methodName&selDeg=manager
我想像下面那样为我新创建的模块使用 url。
admin/Items/1
但是想要使用第一种类型 url,因为它用于以前开发的模块。
是否可以将 url 与 index.php
用于旧模块,而将 index.php
用于新模块。
您可以像这样准备您的配置:
$config['base_url'] = 'your_base_url';
$config['index_page'] = ''; // empty string
$config['enable_query_strings'] = FALSE; // keep it to default FALSE, you can use it even without enabling it here
你的 .htaccess
是这样的:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/ [L]
我想就是这样,现在您可以像这样同时使用 segments
和 query_strings
:
http://localhost/codeigniter/?c=welcome&m=index
http://localhost/codeigniter/welcome/index
http://localhost/codeigniter/index.php/welcome/index
http://localhost/codeigniter/index.php?c=welcome&m=index
http://localhost/codeigniter/index.php/?c=welcome&m=index
我已经在我的环境中测试过,它工作得很好。
编辑:在我的 codeigniter 模板中,我扩展了我的核心路由器并稍微更改了 _set_routing()
方法,如下所示:
当然更改核心系统是一个不好的做法,所以你需要扩展核心路由器文件并在application/core
下创建MY_Router.php
并使其扩展CI_Router
就像这个:
class MY_Router extends CI_Router
{
protected function _set_routing()
{
if (file_exists(APPPATH.'config/routes.php'))
{
include(APPPATH.'config/routes.php');
}
if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/routes.php'))
{
include(APPPATH.'config/'.ENVIRONMENT.'/routes.php');
}
if (isset($route) && is_array($route))
{
isset($route['default_controller']) && $this->default_controller = $route['default_controller'];
isset($route['translate_uri_dashes']) && $this->translate_uri_dashes = $route['translate_uri_dashes'];
unset($route['default_controller'], $route['translate_uri_dashes']);
$this->routes = $route;
}
$_c = trim($this->config->item('controller_trigger'));
if ( ! empty($_GET[$_c]))
{
$this->uri->filter_uri($_GET[$_c]);
$this->set_class($_GET[$_c]);
$_f = trim($this->config->item('function_trigger'));
if ( ! empty($_GET[$_f]))
{
$this->uri->filter_uri($_GET[$_f]);
$this->set_method($_GET[$_f]);
}
$this->uri->rsegments = array(
1 => $this->class,
2 => $this->method
);
}
else
{
if ($this->uri->uri_string !== '')
{
$this->_parse_routes();
}
else
{
$this->_set_default_controller();
}
}
}
}
现在您拥有了两全其美的优势,您将保持您的细分及其好东西不变,但将始终寻找 get c=&m=
,我希望它足够清楚。
我们将所有内容都保留为默认值,并使其使用 c
和 m
检查获取请求,这与 enable_query_strings
所做的非常相似,但没有启用它并弄乱任何东西以继续工作按原样细分..