让mod_rewrite传递$ _GET参数?

时间:2010-07-11 12:26:24

标签: php apache mod-rewrite get

关于这个同样的话题还有其他几个问题,我已经阅读了,但我的情况略有不同。我正在尝试做一个非常基本的mod_rewrite:

RewriteEngine on
RewriteRule ^go/([^/\.]+)/?$ /go.php?page=$1

go.php看起来像这样:

<?php
ini_set('display_errors',1);
if(isset($_GET['page'])){
    echo 'page='.$_GET['page'];
}else{
    echo 'oh shnizzle!';
}
?>

现在,当我在浏览器中转到/go/someword时,$_GET param“someword”未被传递,我收到消息“哦shnizzle!”每次。有什么可能的原因我无法通过mod_rewrite传递任何$_GET参数?

3 个答案:

答案 0 :(得分:13)

您可能已启用MultiViews。将其添加到.htaccess文件的顶部:

Options -MultiViews

问题应该消失,希望如此。

要详细说明在这种情况下发生了什么,您的网址/go/someword指向不存在的资源,因此MultiViews会将其转换为/go.php,它确实存在。发生这种情况时,/somewhere位将作为$_SERVER['PATH_INFO']传递给PHP,但go.php与您的重写规则不匹配,因此不会执行重写以写入该查询字符串。

答案 1 :(得分:8)

您需要在重写规则上使用QSA(查询字符串追加)标记。

RewriteEngine on
RewriteRule ^go/([^/\.]+)/?$ /go.php?page=$1 [QSA]

答案 2 :(得分:0)

一些想法......

RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^/go/([^/\.]+)/?$ /go.php?page=$1 [QSA]

如果请求有效的页面,脚本或目录,则应该停止触发mod_rewrite规则。它还会附加任何现有的查询字符串。

go.php 文件中,我会有以下内容:

<?php
ini_set('display_errors',1);
echo '<b>$_GET Variables</b><pre>';
var_dump( $_GET );
echo '</pre>';
?>

这样,您可以准确地看到将哪些GET变量传递给脚本,而不是查找特定变量(至少在它自身行为之前)。