我可以在脚本执行之前全局设置 $_SERVER['REDIRECT_URL'] 吗?

Bar*_*rry 8 php php-fpm apache-2.2

我正在将许多站点从旧服务器配置迁移到新服务器配置。每个站点都基于类似(但遗憾的是不完全相同)的代码库,使用 mod_rewrite URL。

  • Ubuntu 8.04 LTS => Ubuntu 12.04 LTS
  • Apache 2.22.8 => Apache 2.2.22
  • PHP 5.2 (FastCGI) => PHP 5.3 (PHP5-FPM)

大多数情况下都像魅力一样工作,但在新配置中 $_SERVER['REDIRECT_URL'] 不再设置,并且代码由于依赖于这个全局变量而失败。

据我了解,当发生重定向时,该变量由 Apache 设置。显然现在这不会发生,但我正在努力寻找原因。

  • 是 Apache 升级,还是(我的猜测)从 PHP FastCGI 切换到 PHP5-FPM?
  • 我如何取回这个变量?

我真的不想在每个站点上编辑代码,所以我会在必要时设置一个全局 PHP auto_prepend,但理想情况下我想修复服务器配置并首先设置它。

可能相关:我现在还有几个新的 $_SERVER 变量,即 REDIRECT_SCRIPT_URL 和 REDIRECT_REDIRECT_SCRIPT_URL。这些似乎具有我想要的 REDIRECT_URL 的正确数据,但似乎也表明发生了两个以前没有的内部重定向 - Google 搜索 REDIRECT_REDIRECT_SCRIPT_URL 仅返回随机 var_dump 输出。SCRIPT_URL 是新的 REDIRECT_URL 吗?

编辑 1

再次检查 REDIRECT_URL 已(现在)设置,但始终设置为“index.php”(mod_rewrite 目标)而不是预期的键入 URL。我已经使用 PHP auto_prepend_file 来手动设置所需的变量。

我不确定我是如何在第一轮错过它的,但在此期间我做了一些更改,所以我认为它不存在的外部机会。如果这误导了任何人,我们深表歉意。

编辑 2

为了解决下面提到的 ErrorDocument,使用的 mod_rewrite 规则是:

RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]
Run Code Online (Sandbox Code Playgroud)

$_GET['url'] 变量已设置,因此规则必须有效。

需要明确的是,在这个阶段,我已经使用了我最初提到的 auto_prepend_file 解决方法。

Gar*_*ett 0

根据 PHP 的文档:

\n\n
\n

$_SERVER 是一个包含标头、路径和脚本位置等信息的数组。该数组中的条目由 Web 服务器创建。无法保证每个网络服务器都会提供其中任何一个;服务器可能会省略一些,或提供此处未列出的其他内容。也就是说, \xc2\xbb CGI/1.1 规范中考虑了大量这些变量,因此您应该能够预料到这些变量。

\n
\n\n

因此,似乎并非所有$_SERVER超全局变量都像人们期望的那样与平台无关。$_SERVER[\'REQUEST_URI\']似乎是所有主要网络服务器一致定义的这样一个值,因此您可能想尝试使用它。

\n