关于这个同样的话题还有其他几个问题,我已经阅读了,但我的情况略有不同。我正在尝试做一个非常基本的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
参数?
答案 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变量传递给脚本,而不是查找特定变量(至少在它自身行为之前)。