Codeigniter 带有GET参数的代码点火器重定向问题

Codeigniter 带有GET参数的代码点火器重定向问题,codeigniter,redirect,get,http-status-code-404,Codeigniter,Redirect,Get,Http Status Code 404,我在代码点火器路由方面有困难 转到正确的控制器并执行正确的操作。但是,会导致404错误。也很好用 我在config.php文件中更改了uri_协议,并尝试了不同的值。汽车似乎工作得最好 我的理论是,CodeIgniter使用查询参数进行路由。问题是这些查询参数与路由无关 如何告诉CodeIgniter忽略默认控制器的查询参数 注意,我按照联机说明从URL中删除index.php。我认为这不会造成问题,但这是我的.htaccess文件,以防万一: RewriteEngine On RewriteB

我在代码点火器路由方面有困难

转到正确的控制器并执行正确的操作。但是,会导致404错误。也很好用

我在config.php文件中更改了uri_协议,并尝试了不同的值。汽车似乎工作得最好

我的理论是,CodeIgniter使用查询参数进行路由。问题是这些查询参数与路由无关

如何告诉CodeIgniter忽略默认控制器的查询参数

注意,我按照联机说明从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]

这似乎是CodeIgniter设计方式的一个限制,而不是由于您的路由和/或
.htaccess
。有人提交了一份bug报告。但是,您可以使用如下函数,而不是使用此函数并将
mymethod
代码添加到默认控制器的
index
方法中:

function _remap($method)
{
    if ($method == 'index' && count($_GET) > 0)
    {
        $this->mymethod();
    }
    else
    {
        $this->index();
    }
}

使用下面的配置,它可以很好地为我工作。获取路由到默认控制器的索引方法

.htaccess

RewriteEngine on
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ index.php/$1 [L]
system/application/config/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的干净安装尝试了这个设置,效果很好。这些是我需要做的唯一更改。

使用该重写规则
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
to
RewriteRule^(.*)$/index.php/$1


此时,您可能需要将
uri\u协议
config更改回
PATH\u INFO

以下是我的解决方法: 1.我在.htaccess中有一个标准重写:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [QSA,L]
这可能是无关的,但

  • 在index.php中,我添加了应用程序文件夹外的文件:
  • $pattern=“/\?*$/”; $replacement=''; $\u服务器['REQUEST\u URI']=preg\u replace($pattern,$replacement,$\u服务器['REQUEST\u URI'])


    这将阻止codeigniter尝试在请求中使用querystring。现在您确实需要$\u GET变量吗?它们需要从$\u服务器['REDIRECT\u QUERY\u STRING'中解析出来如果您如上所述使用mod_rewrite,则会设置此选项。

    尝试使用CodeIgniter

    删除
    RewriteRule
    行中的问号,除非您使用的是疯狂的CGI主机或其他东西。根据给出的描述,作者没有启用查询字符串。如果启用了,则给出的示例URL将替换为/mycontroller/mymethod.Also、 除非他做了一些特别的事情,否则CI会清空$\u GET,所以它总是空的。@ebynum:根据他的帖子,使用控制器和方法进入完整的URL时,包含了所有工作:“也可以正常工作”。但你可能是对的。我完全同意。重写规则看起来有点古怪。有时,你需要在查询字符串中传递所有内容,但在传递另一个查询字符串时,这永远不会起作用。如果查询字符串仅用于客户端,你可以在pu重写时删除原始查询字符串在重写字符串的末尾,我必须做两件事:改变你提到的重写规则,同时把uri协议改为ORIG_PATH_INFO。这两件事都解决了问题