Codeigniter重定向GET参数问题

时间:2010-07-23 03:09:29

标签: codeigniter redirect get http-status-code-404

我在使用代码点火器路由时遇到了困难。

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]

5 个答案:

答案 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]

这可能不相关但......

  1. 在index.php中我添加的应用程序文件夹外的文件:
  2. $ 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