如何在 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)