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

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

我正在将许多网站从旧服务器配置迁移到新服务器配置。每个网站都基于类似(但遗憾的是不完全相同)的代码库,使用 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]

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

需要明确的是,在此阶段,我采用了最初提到的 auto_prepend_file 解决方法。

答案1

REDIRECT_URL 仅由 Apache Web 服务器设置,并且仅在某些情况下。这可能不是您的代码应该依赖的东西。据我所知,最好的解决方案是修复有缺陷的 PHP 代码;您不能真正强制在 Apache 中始终设置它。

答案2

根据 PHP 的文档:

$_SERVER 是一个包含诸如标头、路径和脚本位置等信息的数组。此数组中的条目由 Web 服务器创建。不能保证每个 Web 服务器都会提供其中任何一项;服务器可能会省略某些内容,或提供此处未列出的其他内容。也就是说,这些变量中的大量内容都已在» CGI/1.1 规范,所以您应该能够期待这些。

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

答案3

对于我们某个项目中重定向到 index.php 的丢失图像,我仅使用了这个修复程序:

网址:http://www.domanXY.de/image.php?file=var/binaries/store/8dfaadde-5309-4a35-8f9a-d8b9cd807aae.jpg&options=&options=resize_outer(320,150);锐化(64)

<?php
//image.php (newly created)
$_SERVER['REDIRECT_URL'] = "image.php";
include "index.php";

如果您想要一个全局解决方案,我认为您必须使用explode()等并使用另一个给定的变量,如$_SERVER ['REQUEST_URI']。

答案4

您可以设置 php auto-prepend-file 来包含设置此变量的一小段 PHP 代码。

相关内容