为什么RewriteRule在.htaccess中没有R标志时无效

时间:2017-06-04 09:12:04

标签: php apache .htaccess codeigniter mod-rewrite

我在Web根目录的project文件夹中有一个Codeigniter项目。

www
www/.htaccess
www/project/.htaccess ( here are its contents https://pastebin.com/qBbZ0REj )

WWW / htaccess的

 RewriteEngine On
 RewriteRule ^pg/fetchPG/(.*)$ /project/product_groups/fetchPG/$1 [L]

www/project/.htaccess

的相关部分
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]

如果我这样做

http://localhost/pg/fetchPG/?groupid=26&response=html&mode=graph&response=html

它应该显示

的内容
http://localhost/project/product_groups/fetchPG/?groupid=26&response=html&mode=graph&response=html

但它只显示了Codeigniter的404页面。

我认为Querystring丢失了,但是我尝试在那个404页面打印$ _GET,它很好,它就要出现了。

我将[L]替换为[L, R]并且有效,它会重定向到该网址,但我不希望用户看到最终的网址。

PS:我有专门的服务器,我控制了一切,请建议是否还有其他办法来实现我的目标?

1 个答案:

答案 0 :(得分:1)

它与R|redirect标志一起使用的原因是,通过重定向,客户端会发送新请求,因此REQUEST_URI会发生变化。

我假设,CodeIgniter配置为REQUEST_URI而不是QUERY_STRING,这与www/project/.htaccess

中的规则相对应
RewriteRule ^(.*)$ index.php?/$1 [L]

要解决此问题,请按照user guide

中的说明将uri_protocol更改为query_string
  

最后,将以下新项添加到配置文件中(如果需要,还可以编辑该选项):

/*
|------------------------------------------------
| URI PROTOCOL
|------------------------------------------------
|
| This item determines which server global
| should be used to retrieve the URI string. The
| default setting of "auto" works for most servers.
| If your links do not seem to work, try one of
| the other delicious flavors:
|
| 'auto'         Default - auto detects
| 'path_info'    Uses the PATH_INFO
| 'query_string'        Uses the QUERY_STRING
*/

$config['uri_protocol'] = "auto";

在你的情况下,这应该是

$config['uri_protocol'] = "query_string";

为了保留查询字符串,您可以尝试使用path_info,例如

$config['uri_protocol'] = "path_info";

但您还必须将www/project/.htaccess中的重写规则更改为

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

请注意,不再有问号(?)。