3

因此,人们抱怨在使用 VirtualDocumentRoot 和 mod_vhost_alias 运行 Apache 时,使用 DOCUMENT_ROOT 的 PHP 脚本是如何中断的,因为 DOCUMENT_ROOT 没有正确设置。Apache 显然在不久前修复了这个问题,简要说明如下:http: //svn.apache.org/viewvc ?view=revision&revision=1132494

遗憾的是,没有足够的细节解释如何根据每个请求实际覆盖 DocumentRoot。我猜它必须以某种方式使用 mod_rewrite 完成,但我不确定。有谁知道如何做到这一点?

4

2 回答 2

3

好吧,显然,我问的问题并不正确。以下是我在 Apache2 Bugzilla 列表中直接从 Stephan 那里获得的一些信息:

斯蒂芬 说:

错误报告是关于 VirtualDocumentRoot 的,现在可以正确设置 DOCUMENT_ROOT。因此问题得到解决。

我回过头来澄清:

也许我错过了一些东西,但我很确定我在 php 中测试了 $_SERVER['DOCUMENT_ROOT'] 并​​且它与 VirtualDocumentRoot 设置的值不匹配。你说它现在应该匹配?

他回答说:

是的,在 2.4.x 中。该修复程序不太可能移植到 2.2.x,因为它需要仅存在于 2.4 中的基础架构。

所以我运行了 apache2 -v 并发现我没有运行 2.4.x。Apache2 -v 显示了这一点:

Server version: Apache/2.2.16 (Debian)
Server built:   Nov 30 2012 08:33:45

如果你注意到服务器是在今年 11 月底我使用 aptitude -install apache2 时构建的。我不知道 apt-get 是否会改为使用 apache 2.4。这很蹩脚。2.4.3 稳定版于 8 月发布。我不知道为什么 aptitude 会拉到 2.2,但这确实给我制造了一场噩梦。

So in reality, the question I asked was moot. Everything should have worked fine, except that aptitude installed an outdated apache2 and I didn't realize what was going on. There is no bug anymore.

于 2012-12-27T22:06:38.907 回答
1

mod_vhost_alias 是官方发行版中唯一设置每个请求文档根的模块。

预先存在的代码,包括设置 DOCUMENT_ROOT CGI 环境变量的代码,通过 ap_document_root(r) 查找文档根目录会看到这些更改。

此更改还为 mod_userdir 等模块引入了一个新概念,其中“文档根”并不合适。这个新概念有新的 API 和新的 CGI 环境变量(CONTEXT_PREFIX、CONTEXT_DOCUMENT_ROOT),它们不绑定到传统的文档根目录。

我认为唯一相关的真实文档是:

  • 开发人员文档(基本完成)
  • 为看到由 mod_vhost_alias 设置的 DOCUMENT_ROOT 的迁移人员提供的文档
  • 关于新 CONTEXT_* 变量是什么的 CGI/环境变量文档

但是,我不认为这些是待办事项,因为 mod_vhost_alias 和现有的 DocumentRoot API 和环境变量正在协同工作。

如果问题确实是 mod_vhost_alias 之外的“如何”,请查看 mod_userdir 和 mod_vhost_alias 之间关于 ap_set_document_root() 和 ap_set_context_info() 的区别,然后查看它们如何导致 server/util_script.c 中的 CGI 环境变量。

于 2012-12-26T17:23:52.293 回答