我在使用代码点火器路由时遇到了困难。
http://www.mysite.com转到正确的控制器并做正确的事。但是,http://www.mysite.com/?ref=p&t2=455会导致404错误。 http://www.mysite.com/mycontroller/mymethod/?ref=p&t2=455也可以正常工作。
我更改了config.php文件中的uri_protocol并尝试了不同的值。汽车似乎工作得最好。
我的理论是代码点火器正在使用查询参数来进行路由。问题是这些查询参数与路由无关。
如何告诉代码点火器忽略默认控制器的查询参数?
注意,我按照说明在线删除了URL中的index.php。我不认为它会导致问题,但这是我的.htaccess文件以防万一:
RewriteEngine On
RewriteBase /~trifecta/prod/
#Removes access to the system folder by users.
#Additionally this will allow you to create a System.php controller,
#previously this would not have been possible.
#'system' can be replaced if you have renamed your system folder.
RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]
#Checks to see if the user is attempting to access a valid file,
#such as an image or css document, if this isn't true it sends the
#request to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#This last condition enables access to the images and css folders, and the robots.txt file
#Submitted by Michael Radlmaier (mradlmaier)
RewriteCond $1 !^(index\.php|images|robots\.txt|css)
RewriteRule ^(.*)$ index.php?/$1 [L]
答案 0 :(得分:5)
使用重写规则RewriteRule ^(.*)$ /index.php?/$1
,下面是一些正在发生的重写的例子:
http://www.mysite.com
=>
http://www.mysite.com/index.php?/
(实际上,这可能根本没有被重写)
http://www.mysite.com/mycontroller/mymethod/?ref=p&t2=455
=>
http://www.mysite.com/index.php?/mycontroller/mymethod/?ref=p&t2=455
http://www.mysite.com/?ref=p&ts=455
=>
http://www.mysite.com/index.php?/?ref=p&t2=455
无论是否正在重写,第一个都将起作用。 CodeIgniter正在处理一个空查询字符串(这很容易)或一个简单的查询字符串“/”。
正在重写第二个(也可以),但CodeIgniter能够处理其查询字符串,即/mycontroller/mymethod/?ref=p&t2=455
。 CI将其转换为一系列段
[0] => mycontroller
[1] => mymethod
[2] => ?ref=p&t2=455
数组索引2最终会被你正在做的任何事情忽略。
第三个(不工作正在被重写,CodeIgniter根本无法处理它的查询字符串。它的查询字符串被重写为:/?ref=p&t2=455
。一系列看起来像这样的段:
[0] => ?ref=p&t2=455
与您网站上的任何控制器都不匹配。
或许,您可以通过修改重写规则来解决整个问题
RewriteRule ^(.*)$ /index.php?/$1
到
RewriteRule ^(.*)$ /index.php/$1
此时您可能希望将uri_protocol
配置更改回PATH_INFO
。
答案 1 :(得分:0)
似乎是CodeIgniter设计方式的限制,而不是路由和/或.htaccess
的结果。有人提交了错误报告here。但是,您可以使用_remap()
函数,而不是使用此代码并将mymethod
代码添加到默认控制器的index
方法中,而不是这样:
function _remap($method)
{
if ($method == 'index' && count($_GET) > 0)
{
$this->mymethod();
}
else
{
$this->index();
}
}
答案 2 :(得分:0)
使用以下配置,它对我来说很好。 http://www.site.com/?x=y被路由到默认控制器的索引方法。
<强>的.htaccess 强>
RewriteEngine on
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ index.php/$1 [L]
<强>系统/应用/配置/ config.php中强>
$config['base_url'] = "http://www.site.com/";
$config['index_page'] = "";
$config['uri_protocol'] = "PATH_INFO";
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-?';
还记得加吗?到URL中允许的字符列表。也许这会导致问题。我刚刚使用CodeIgniter的干净安装尝试了这个设置,它工作正常。这是我需要做的唯一改变。
答案 3 :(得分:0)
以下是我如何解决这个问题: 1.我在.htaccess中有一个标准的重写:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [QSA,L]
这可能不相关但......
$ pattern =“/\?。* $ /”; $ replacement =''; $ _SERVER ['REQUEST_URI'] = preg_replace($ pattern,$ replacement,$ _SERVER ['REQUEST_URI']);
这会阻止codeigniter尝试在请求中使用查询字符串。现在你真的需要$ _GET变量吗?它们需要从$ _SERVER ['REDIRECT_QUERY_STRING']中解析出来,如果您使用上面的mod_rewrite,它将被设置。
答案 4 :(得分:0)
尝试CodeIgniter Super .htaccess file