【问题标题】:mod_rewrite PHP $_GET emptymod_rewrite PHP $_GET 空
【发布时间】:2015-01-01 22:06:45
【问题描述】:

我有以下 .htaccess 文件:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule api/(.*)$ api.php?m=$1 [QSA,NC,L]
</IfModule>

URL 重写效果很好。我可以去http://myserver.com/api/example,它的行为就像我去http://myserver.com/api.php?m=example一样。问题是 PHP $_REQUEST 和 $_GET 变量是空的。我不应该仍然能够获得 $_REQUEST['m'] 的值吗?

经过一番谷歌搜索,我找到了禁用 MultiViews 的建议。如果我添加 Options -MultiViews,我会收到 404 错误。

我做错了什么?谢谢。

【问题讨论】:

    标签: php apache .htaccess mod-rewrite


    【解决方案1】:

    听起来你没有启用 mod_rewrite。由于未启用,IfModule 容器将被忽略。见:How to enable mod_rewrite for Apache 2.2

    必须关闭 Multiviews 以使其工作,否则 mod_negotiation 将被激活并自动将 /api/ 映射到 /api.php 而不给 mod_rewrite 做任何事情的机会。所以你需要这条线:

    Options -MultiViews
    

    如果您无法启用 mod_rewrite,您也可以更改 api.php 脚本,使其在 PATH_INFO 变量中查找:

    $_SERVER['PATH_INFO']
    

    获取“示例”部分。

    【讨论】:

    • mod_rewrite 已启用。我检查了 phpinfo() 并使用了函数 in_array('mod_rewrite',apache_get_modules())。如果这很重要,它是一个我没有管理访问权限的共享服务器。此外,重写实际上正在工作 - 它正在将 /api/example 发送到 /api.php?m=example。
    • 实际上我收回了这一点,MultiViews 正在将 /api/whatever 重定向到 api.php...然后我失去了 $_GET。我将 Options -MultiViews 移到了 IfModule 之外,这很有效。我仍然不明白为什么在 IfModule 中出现 404 错误。
    • 我接受了这个作为答案,因为 MultiViews 是问题的一部分。我还必须提供 api.php 的完整路径。
    猜你喜欢
    • 1970-01-01
    • 2012-05-24
    • 2010-12-02
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2011-03-14
    • 2013-01-17
    相关资源
    最近更新 更多