我需要将$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。
答案 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¶m2=value2
最后,你得到:
http://yourhost.com/index.php?baseurl=/module/action¶m1=value1¶m2=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的路径信息。