【问题标题】:PHP global variable doesn't work when using mod_rewrite [duplicate]使用 mod_rewrite 时 PHP 全局变量不起作用 [重复]
【发布时间】:2012-08-29 23:40:39
【问题描述】:

可能重复:
global variables in php not working as expected

我有一个在网站的每个页面上运行的 php 函数,它使用全局变量,例如:

$var = "test";
function test() {
    global $var;
    echo $var;
}

这在直接访问 /anyFile.php 时可以正常工作,但是网站使用 htaccess 文件来重写 url,例如:

RewriteRule ^action/(.*)$ /index.php?action=$1 [L]

当一个url被htaccess重写时,函数不起作用,$var没有设置。

这是怎么回事?我该如何解决?(我需要使用“全局”,否则我需要重新编码很多东西。

【问题讨论】:

  • 您的$var 没有在全局上下文中定义,因为可能(那是您没有显示的代码)index.php 从函数(=本地范围)调用操作脚本。跨度>
  • 发布您的实际代码。 Apache 不能影响 PHP 变量,除非传入 $_GET,除非 register_globals 为 On,它不应该!!!!
  • 这些行在一起吗? mod_rewrite 不影响 php...一定有其他事情发生或者 $var 正在其他地方被修改。
  • 我没有显示的代码是无关紧要的,太长了,不能在这里发布。我用我在问题中发布的确切功能对其进行了测试,它在访问 /index.php?action=anything 时有效,但在访问 /action/anything 时它不起作用(未设置 $var)。我试过$GLOBAL['var'],第二个url也没有设置。

标签: php .htaccess mod-rewrite global-variables


【解决方案1】:

您需要使用[QSA,L] 而不是[L]:

RewriteRule ^action/(.*)$ /index.php?action=$1 [QSA,L]

QSA 代表Query String Append,并将查询字符串(url 中? 之后的部分)转发到PHP 脚本。

顺便说一句,您应该不使用register_globals(不推荐使用从 PHP 5.3 开始,从 PHP 5.4 开始删除),但是请改用$_GET superglobal。

--- 编辑---

根据您在下面的评论(您无法修改 .htaccess),您很不走运。您唯一的解决方案是解析请求 URI 中的查询字符串,并像使用 $_GET 超全局一样使用它:

$queryString = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY);
parse_str($queryString, $query);
echo $query['action'];

不过,我强烈建议您修改 .htaccess。

【讨论】:

  • htaccess 来自脚本而不是我的代码,所以我不认为我会修改它,我可能会破坏某些东西。我也试过 $GLOBAL['var'],但它没有设置在重写的 url 上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 2013-07-13
  • 2010-10-20
  • 1970-01-01
相关资源
最近更新 更多