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


8

我正在将许多站点从旧服务器配置迁移到新服务器。每个站点都使用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未显示尽职调查。快速的Google搜索不能代替阅读文档。在升级系统或代码之前,您应确保至少了解影响您的系统或项目的更改。
约翰·加迪尼尔

抱歉,不清楚;我尽力阅读了文档。然后,当我遇到无法解释的问题时,我求助于Google。该配置位于单独的计算机上,在进行移动前测试期间,我发现了上述问题。但是,我发现自己犯了一个错误,因此我将更新问题。
巴里

如果您事先告诉我们这些事情,这确实符合您和我们的最大利益。我推翻了我的投票。
John Gardeniers 2012年

您能否为我们提供有关先前和新服务器配置的更多信息?我认为PHP中REDIRECT_URL的设置来自Apache中的SCRIPT_URL环境变量,但是有很多事情可能会修改该导入的行为(例如suPHP,包装引擎,AddTypeHandler语句等)。
乔恩·克洛斯凯

Answers:


3

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


感谢您的答复,但是很遗憾,在该链接上我看不到任何与我的问题相关的信息。我不认为外部ErrorDocument参与其中。我希望可以更改现有代码,但目前还不能选择。
巴里

关键是,仅在ErrorDocument处理期间设置REDIRECT_URL。这意味着您的PHP脚本在原始配置中已作为ErrorDocuments加载,并且编写脚本的人都依赖此行为。既然没有发生,脚本就会中断。
迈克尔·汉普顿

没有使用中的ErrorDocument定义,我看不到mod_rewrite RewriteRule(在上面添加)是如何涉及到的。我与您不同意REDIRECT_URL不能得到保证,我只是找不到有关原因的任何相关文档。
巴里

我在答案中链接到上面。如果您还需要其他内容,则必须阅读Apache源代码。无论如何,请记住通过单击旁边的复选标记的轮廓来接受可以解决问题的答案,并欢迎使用Server Fault。
迈克尔·汉普顿

0

根据PHP的文档:

$ _SERVER是一个包含标题,路径和脚本位置等信息的数组。该数组中的条目由Web服务器创建。不能保证每个Web服务器都可以提供其中的任何一个。服务器可能会省略某些服务器,或提供此处未列出的其他服务器。就是说,在»CGI / 1.1规范中考虑了很多这些变量,因此您应该可以期待这些变量。

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


谢谢您,但是我已经知道有时设置了,有时没有设置。我所希望的是一种主动影响为我的特定配置设置哪些变量的方法,因为我找不到基于我的配置的任何文档(即,在构建环境之前我将如何知道)。
巴里

0

对于我们重定向到index.php的项目之一中丢失的图像,我只是使用了此修复程序:

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

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

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


-1

您可以设置一个php自动前置文件,以包含一小段可设置此变量的PHP代码。


在我的问题中,我已经确定这是我不可能采取的行动。根据您回答之前所做的修改,这也是我最终要做的。
巴里

抱歉,我不记得在发布之前看到过修改;可能是在您进行编辑之前我已经开始回复,但是我不确定,因为随后的编辑已删除了原始编辑的日期戳:/我也应该更清楚地表明我的建议可能是正确的方法实现您追求的目标,而不是“后备”。您可以在重写规则中使用[E:blah = blah]标志来设置任意环境变量,然后在预包含文件中读取内容,该文件比使用GET变量将内容从重定向引擎传递到代码的方法更干净。
乔恩·克洛斯凯

所谓“可能正确”,是指我过去在多个地方都做过这件事。
乔恩·克洛斯凯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.