我正在将许多网站从旧服务器配置迁移到新服务器配置。每个网站都基于类似(但遗憾的是不完全相同)的代码库,使用 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 的丢失图像,我仅使用了这个修复程序:
<?php
//image.php (newly created)
$_SERVER['REDIRECT_URL'] = "image.php";
include "index.php";
如果您想要一个全局解决方案,我认为您必须使用explode()等并使用另一个给定的变量,如$_SERVER ['REQUEST_URI']。
答案4
您可以设置 php auto-prepend-file 来包含设置此变量的一小段 PHP 代码。