如何在 XAMPP 的 VirtualHost 中访问 DocumentRoot 之外的文件?

Posted

技术标签:

【中文标题】如何在 XAMPP 的 VirtualHost 中访问 DocumentRoot 之外的文件?【英文标题】:How to access files outside the DocumentRoot in a VirtualHost in XAMPP? 【发布时间】:2013-02-17 09:17:29 【问题描述】:

我在 Windows 7 中配置了一个虚拟主机。该项目位于C:\project,结构如下:

project
  \cache
  \configs
  \htdocs
    \css
    \images
    \js
    \.htaccess
    \index.php
  \includes
    \setup.php
    \en.php
  \lib
  \templates
  \templates_c

在我的httpd-vhosts.conf 中,我创建了一个虚拟主机:

 <VirtualHost *:80>
    DocumentRoot "C:/project/htdocs"
    ServerName project.dev

    <Directory "C:/project/htdocs">
        Options Indexes FollowSymLinks ExecCGI Includes
        AllowOverride All
        Order allow,deny
        Allow from all
        Require all granted
    </Directory>
</VirtualHost>

并将127.0.0.1 project.dev 添加到C:\Windows\System32\drivers\etc\hosts

问题是我希望htdocs 成为httpd 将提供文件的目录,但我想通过PHP 包含位于includes 目录中的文件。

我该如何解决这个问题?我已经尝试了很多解决方案,从 $_SERVER['DOCUMENT_ROOT'] 到 Apache Alias 和 .htaccess 调整,但到目前为止都没有奏效。一定有一些简单的解决方案。也许我不太正确地理解 DocumentRoot 的概念。我只想模拟典型的服务器文件夹public_html/www/htdocs,同时将重要文件排除在浏览器/用户范围之外。

【问题讨论】:

【参考方案1】:

在您的虚拟主机或 .htaccess 中设置包含路径:

php_value include_path ".;c:/project"

【讨论】:

无论我在htdocs 中的级别如何,这些方法中的任何一种都可以让我包含一个文件吗? 我已将答案更新为唯一可行的方法,无论文件位于何处或从 htdocs 中访问。 谢谢!这是一种常见的做法吗?还是应该避免? 不久前,我阅读了一些关于 include_path 的优点/缺点,并决定不使用它。我保持我的应用程序包含/要求与项目位置上方的一个目录级别一致(例如 htdocs)。因此,除非文件位于同一目录中,否则我将在整个项目中包含“../lib/myClass.php”。我使用项目根目录上方的一个目录,因为应用程序通常从 ./htdocs、./bin 或 ./app 执行。【参考方案2】:

这是我从httpd-vhosts.conf 获取的 VHost。我做的唯一额外配置是绕过我击中的 403:

<VirtualHost *:80>
    ServerName "Markdown.loc"
    ServerAlias "www.Markdown.loc"
    DocumentRoot "C:\INTERNAL\PHP\Markdown"
    <Directory "C:\INTERNAL\PHP\Markdown">
        Options +Indexes
        AllowOverride All
    </Directory>
</VirtualHost>

我所有的其他 VHost 都是这样的:

<VirtualHost *:80>
    DocumentRoot "C:/xampp/htdocs/somesite.loc"
    ServerName somesite.loc
    ServerAlias www.somesite.loc
</VirtualHost>

如果您只是想在与您的 htdocs 相同级别的目录中包含某些内容,include("../includes/somefile.php") 应该可以正常工作。

如果我的问题有误,请告诉我,我会尽力为您提供更多帮助。

【讨论】:

如果在目录组中我像你一样只使用AllowOverride All,我会得到一个“禁止访问”页面。 而且,是的,include("../includes/somefile.php") 工作正常。但是因为我看到的所有示例都使用了绝对路径,所以我从未想过使用这种简单的相对路径。我之前的配置将 DocumentRoot 设置为“C:/project”而不是“C:/project/htdocs”,这没有帮助(mod_rewrite 完成了剩下的工作)。 @RenatoRodrigues 很高兴听到您成功了!有时最简单的解决方案很容易被忽视。 没错!但是,呃,现在又出现了一个新问题。 include("../includes/setup.php") 适用于 htdocs 根目录中的文件。在project/htdocs/admin/index.php,我有include("../../includes/setup.php")(所以它可以追溯到两个级别)。到目前为止,一切都很好。但是,setup.php 在lib 文件夹中找不到文件,因为相对路径;它以require(../lib/Smarty/Smarty.class.php) 失败。 这一行在setup.php: require(dirname(dirname(__FILE__)) . '/lib/Smarty/Smarty.class.php'); 中起到了作用,我使用dirname(dirname(__FILE__)) 而不是简单的require(/lib/Smarty...)。只是希望即使我将setup.php 包含在htdocs 的更深层次中,这也不会中断

以上是关于如何在 XAMPP 的 VirtualHost 中访问 DocumentRoot 之外的文件?的主要内容,如果未能解决你的问题,请参考以下文章

添加 VirtualHost 失败:访问禁止错误 403 (XAMPP) (Windows 7)

添加 VirtualHost 失败:访问禁止错误 403 (XAMPP) (Windows 7)

添加 VirtualHost 失败:访问禁止错误 403 (XAMPP) (Windows 7)

添加 VirtualHost 失败:访问禁止错误 403 (XAMPP) (Windows 7)

当我在 VirtualHost 中更改 ServerName 时,Apache (xampp) 不起作用

Apache2指令通过VirtualHost容器与xampp冲突