我有一台 Apache 服务器,它为一个站点(例如 example.com,位于 /var/www/html/
)和另一个站点(例如 othersite.com,位于 /home/michael/public_html/
)提供服务。我在后一个目录中有一个符号链接,它指向前一个文件。这是一个示例目录结构,为我要执行的操作提供一些上下文。
/var/www/html/:
header.php
a.php
mydir/:
b.php
/home/michael/public_html/:
header.php -> /var/www/html/header.php
a.php
mydir/:
b.php
header.php
包括行 require('a.php');
。我期望的是,如果我正在访问 example.com,此 require
将加载到位于 /var/www/html/a.php
的文件中,但如果我在 othersite.com,它将加载 {{ 1}}。
为了更加清楚,假设这两个 /home/michael/public_html/a.php
文件具有以下内容:
a.php
如果我将浏览器指向 example.com/header.php,我会看到“我在 example.com”。同样,转到 othersite.com/header.php,我看到“我在 othersite.com”。到目前为止一切顺利。
这是我的问题。两个站点中的文件 /var/www/html/a.php:
echo("I'm on example.com");
/home/michael/public_html/a.php:
echo("I'm on othersite.com");
都有 mydir/b.php
行,以便加载 require('../header.php')
。再次,我希望看到不同的字符串,具体取决于我所在的站点我来访。但是在我的浏览器中,当我同时访问 example.com/mydir/b.php 和 othersite.com/mydir/b.php 时,我看到“我在 example.com 上”。
通过阅读 require/include 的文档,我很确定我明白发生了什么。
- 当我转到 othersite.com/header.php 时,当前工作目录是
header.php
。因此/home/michael/public_html/
行正确加载了require('a.php');
,因为它能够在当前工作目录中找到它。 - 当我转到 othersite.com/mydir/b.php 时,当前工作目录是
/home/michael/public_html/a.php
。在这种情况下,/home/michael/public_html/mydir/
不在当前工作目录中,因此不会从那里加载。相反,PHP 会检查调用脚本的目录中是否有a.php
。由于a.php
是指向/home/michael/public_html/header.php
的符号链接,因此它始终将“调用脚本的目录”视为/var/www/html/header.php
,因此它始终加载/var/www/html/
。
那是很多细节,但我希望一切都清楚。
我想要的是让 /var/www/html/a.php
被 othersite.com/mydir/b.php 加载的某种方式。在我的脑海中,我想我正在寻找某种方法来获取 /home/michael/public_html/a.php
的父目录,例如 header.php
,但它也可以检测脚本何时被符号链接调用,并返回父目录链接的目录。然后,我可以在调用 dirname(__FILE__)
之前chdir(...)
到我想要的目录,然后再切换回来。
当然,我对其他建议持开放态度,但我肯定希望它们只涉及更改 a.php
而不是 header.php
。这是因为 mydir/b.php
确实代表了几个不同目录级别的数百个页面,其中许多页面我没有管理,并且编辑所有这些页面是不可行的。
这可能吗?