Codeigniter $ config ['uri_protocol']问题

时间:2009-12-09 08:57:05

标签: .htaccess codeigniter

我需要将$config['uri_protocol']从AUTO更改为PATH_INFO(以允许url参数)

我的问题:当我设置$config['uri_protocol']="PATH_INFO";常规网址停止运行时,无论我点击哪个网站页面网址,我都会收到主页。

print_r($ _SERVER)显示我添加的url参数仅出现在REQUEST_URI中,而不出现在任何其他$ _SERVER部分中。

我的htaccess是standard one

<IfModule mod_rewrite.c>
    RewriteEngine On

    # This is different between local host and production server!!!
    RewriteBase /


    #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
    RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

<IfModule !mod_rewrite.c>
    # If we don't have mod_rewrite installed, all 404's
    # can be sent to index.php, and everything works as normal.
    # Submitted by: ElliotHaughin

    ErrorDocument 404 /index.php
</IfModule> 

更新:

我改变了

RewriteRule ^(.*)$ index.php?/$1 [L]

RewriteRule ^(.*)$ index.php?/$1 [QSA,L]允许url params通过。现在url params也出现在

 $_SERVER

 REDIRECT_QUERY_STRING, QUERY_STRING AND REQUEST_URI

问题:我尝试使用以上所有选项的$ config ['uri_protocol'],但每当我添加网址参数时,CI仍会给出错误404.

注意:我在2台服务器上尝试了上述操作。其中一个是centos5 / Apache2 / Plesk VPS,另一个是xampp / Vista。

6 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,当我将uri_protocol设置为PATH_INFO时,我网站的所有链接都转到默认控制器&amp;行动。然后我发现我的服务器不支持PATH_INO变量,所以我在config.php中执行了两个步骤来解决问题:

首先:

$_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];

然后:

$config['uri_protocol'] = 'PATH_INFO';

以上两行解决了我的问题。

答案 1 :(得分:1)

您应该在mod_rewrite的最后一条规则中使用[QSA]选项... 这会将查询字符串参数(我的意思是'?'后面)附加到最终的URL。

你的规则如下:

RewriteRule ^(.*)$ index.php?baseurl=$1 [QSA,L]

如果您的请求是:

http://yourhost.com/module/action?param1=value1&param2=value2

最后,你得到:

http://yourhost.com/index.php?baseurl=/module/action&param1=value1&param2=value2

我还没有测试过。这是你真正想要的吗?

答案 2 :(得分:1)

在这种情况下,您不希望将$ config ['uri_protocol']设置为PATH_INFO。 var_dump($ _ SERVER)某处找到哪个变量包含您想要的路径,然后将其设置为,如果AUTO不起作用。

答案 3 :(得分:1)

最好的方法是检查从服务器获取的参数。

如果您获得$_SERVER['PATH_INFO'],请使用以下内容。

$config['uri_protocol'] = 'PATH_INFO';

否则,如果您收到$_SERVER['ORIG_PATH_INFO'],请使用此选项:

$config['uri_protocol'] = 'ORIG_PATH_INFO';

在配置文件中进行这些更改。

答案 4 :(得分:0)

答案 5 :(得分:0)

我的问题:当我设置$config['uri_protocol']="PATH_INFO";时,常规网址就会停止运行,无论单击哪个站点页面URL,我都会获得首页。

这可能是因为您实际上并未在RewriteRule指令中将URL路径作为PATH_INFO传递:

RewriteRule ^(.*)$ index.php?/$1 [L]

此处,URL路径作为query_string传递,而path_info为 empty (这将解释为什么所有请求最终都出现在您的主页上)。在这种情况下,您需要附加的QSA标志,以便从请求中追加任何附加的查询字符串(如您的问题所述)。

要将URL路径作为path_info(即其他路径名信息)传递,您需要从? 替代RewriteRule >。 (然后,您不需要QSA标志,因为来自请求的查询字符串将自动传递给 substitution 。)

例如,要使用PATH_INFO,请像这样构造RewriteRule指令:

RewriteRule (.*) index.php/$1 [L]

正则表达式(.*)^(.*)$相同,因为默认情况下正则表达式是贪婪的。


请注意,您的服务器也必须配置为接受path-info(否则它将触发自动404)。默认情况下,这取决于关联的文件处理程序。与.php文件关联的处理程序默认情况下将接受path-info。 (.html文件不会。)但是,如果您需要显式启用此功能,请在.htaccess文件的顶部添加以下内容:

AcceptPathInfo On

这将启用所有URL的路径信息。