【问题标题】:Getting mod_rewrite to pass $_GET params?让 mod_rewrite 传递 $_GET 参数?
【发布时间】:2011-03-14 11:24:46
【问题描述】:

我读过关于同一主题的其他几个问题,但我的问题略有不同。我正在尝试做一个非常基本的 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 参数“someword”没有传递,我收到消息“oh shnizzle!”每次。我无法通过 mod_rewrite 传递任何 $_GET 参数的可能原因是什么?

【问题讨论】:

  • 我的代码似乎没有问题......我唯一要做的就是将/go.php?page=$1更改为相对地址go.php?page=$1
  • 嗯。我只是将我的地址更改为相对地址,但仍然无法正常工作......得到了我通常的结果:“on shnizzle!”任何人都知道是否有我不知道的 mod_rewrite 的全局配置选项? (也许我的服务器上的某些东西被关闭了?)

标签: php apache mod-rewrite get


【解决方案1】:

您可能打开了MultiViews。将此添加到您的 .htaccess 文件的顶部:

Options -MultiViews

希望问题应该会消失。

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

【讨论】:

  • 太棒了!是的,就是这样。重写现在工作得很好,并且 $_GET 参数正在通过。谢谢!
【解决方案2】:

您的重写规则需要 QSA(查询字符串附加)标志。

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

【讨论】:

  • 我还应该提到,当我使用 [QSA] 时,也不会传递普通的查询字符串。你知道是否有特定的 mod_rewrite 配置设置会完全关闭 GET all-together?
  • 这不是 QSA 所修复的 - 它只是允许将原始 url 上的任何查询字符串放入重写的 URL 中
  • 保罗,你是对的 - 抱歉,没有正确阅读问题。
【解决方案3】:

一些想法...

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 变量。

【讨论】:

    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 2012-07-03
    相关资源
    最近更新 更多