使用mod_rewrite进行奇怪的查询字符串行为

时间:2014-11-27 15:00:25

标签: php apache .htaccess mod-rewrite

我有一个网址" / test / index?p = 1"以及以下apache重写规则(使用FuelPHP Framework):

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# deal with php5-cgi first
<IfModule mod_fcgid.c>
    RewriteRule ^(.*)$ index.php?/$1 [QSA,L]
</IfModule>

<IfModule !mod_fcgid.c>
    # for normal Apache installations
    <IfModule mod_php5.c>
        RewriteRule ^(.*)$ index.php/$1 [L]
    </IfModule>
    # for Apache FGCI installations
    <IfModule !mod_php5.c>
        RewriteRule ^(.*)$ index.php?/$1 [QSA,L]
    </IfModule>
</IfModule>

在index.php中,我只是这样做:

print_r($_GET);
print_r($_REQUEST);
print_r($_SERVER);

在我的本地Xamp安装(带有mod_php5的Windows)上,我得到以下输出:

// print_r($_GET);
Array
(
    [p] => 1
)
// print_r($_REQUEST);
Array
(
    [p] => 1
)
// print_r($_SERVER);
....
    [QUERY_STRING] => p=1
    [REQUEST_URI] => /test/index?p=1
    [SCRIPT_NAME] => /index.php
...

好的,这就是我的期望。但是在我的Ubuntu 12.04服务器上(使用FastCGI),我得到了:

// print_r($_GET);
Array
(
    [/test/index] => 
    [p] => 1
)
// print_r($_REQUEST);
Array
(
    [/test/index] => 
    [p] => 1
)
// print_r($_SERVER);
...
[QUERY_STRING] => /test/index&p=1
[REQUEST_URI] => /test/index?p=1
[SCRIPT_NAME] => /index.php
...

所以问题是,$ _GET不仅会返回&#34; p&#34;还会&#34; / test / index&#34;。

任何想法如何解决?

1 个答案:

答案 0 :(得分:0)

这是因为在您的Ubuntu 12.04服务器上它正在访问此块:

<IfModule !mod_php5.c>
    RewriteRule ^(.*)$ index.php?/$1 [QSA,L]
</IfModule>

原因可能是您没有在Apache中加载mod_php5模块。

由于您使用$_GET标记,您在QSA中获得了2个元素。 QSA(查询字符串追加)标志在添加新查询参数时保留现有查询参数。因此,对于/test/index?p=1的URI,您将获得:

  1. p=12(预先存在的查询字符串)
  2. /test/index/$1的抓取值)
  3. 要更改此行为,您可以将.htaccess保留为:

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    # deal with php5-cgi first
    <IfModule mod_fcgid.c>
        RewriteRule ^(.*)$ index.php?/$1 [QSA,L]
    </IfModule>
    
    <IfModule !mod_fcgid.c>
       RewriteRule ^(.*)$ index.php/$1 [L]
    </IfModule>