PHP & .htaccess:为多个目录添加文件

Posted

技术标签:

【中文标题】PHP & .htaccess:为多个目录添加文件【英文标题】:PHP & .htaccess: prepend file for Multiple Directories 【发布时间】:2017-08-12 03:06:04 【问题描述】:

我想使用.htaccess 自动添加 php 脚本。我知道有一个指令可以做到这一点。我在 web 根目录的 .htaccess 文件中有以下内容:

php_value auto_prepend_file "./init.php"

init.php文件的内容包括:

<?php
    $_SERVER['WEB_ROOT']=
        str_replace($_SERVER['SCRIPT_NAME'],'',
        $_SERVER['SCRIPT_FILENAME']);

这会计算 web 根的路径并将其放入超全局中。这是我能想到的唯一实用的方法来跟踪诸如包含之类的 Web 根目录。

问题在于这仅适用于 Web 根目录中的 PHP 脚本。如果脚本本身位于子目录中,则会出现错误,因为 init.php 文件不在当前目录中。我想指定init.php 的绝对路径,因为目前的电流有点不稳定。

我能想到 2 个解决方案:

在使用相对路径 (../init.php) 指向父目录的子目录中包含一个 .htaccess 文件 在所有子目录中包含一个init.php 文件

是否有另一种方法可以指定适用于所有子目录的前置文件?

如果做不到这一点,是否有另一种方法可以将 web 根放入超全局而不用这种废话?

【问题讨论】:

【参考方案1】:

定义相对于自动前置文件 itsef 的路径。

init.php

define('WEBROOT', __DIR__);

然后,您应该能够在应用程序中的任何位置使用WEBROOT。或者,如果您想坚持当前的方法:

$_SERVER['WEB_ROOT'] = __DIR__;

只是好奇。为什么不直接使用$_SERVER['DOCUMENT_ROOT']。这不是指你的网络根吗?

【讨论】:

感谢您的回答。但是,它对我不起作用。我喜欢你使用__DIR__ 的方法,这比我的要好,但问题首先在于init.php 文件。 .htaccess 文件位于 web 根目录中,init.php 文件也是如此,但如果我从子目录加载 init.php 文件位于错误位置。 恰如其分$_SERVER['DOCUMENT_ROOT'],这似乎是主文档根目录。我有许多虚拟主机,这似乎没有引用它们。 @Manngo,我有点困惑。 __DIR__ 返回当前文件的目录,因此如果您使用与auto_prepend_file 相同的init.php,那么无论您实际运行哪个脚本,init.php 及其目录都不会改变。我错过了什么? 出于测试目的,我在init.php 中有print __DIR__;。两者都在 web 根目录中。如果我从子目录执行 PHP 文件 (articles.php),我会得到 Fatal error: Unknown: Failed opening required 'init.php' (include_path='.:/usr/share/pear:/usr/share/php') in Unknown on line 0。我认为这是因为.htaccess 指示articles.php 文件将init.php 从相同的子目录中添加,该子目录不存在——仅在父根目录中。问题不在于init.php 文件本身,而在于从子目录中引用它。 @Manngo 哦,我明白了。不要在.htaccess 文件中设置auto_prepend_file。改为在php.ini 中执行一次。记得重启服务器。

以上是关于PHP & .htaccess:为多个目录添加文件的主要内容,如果未能解决你的问题,请参考以下文章

将多个 php 文件视为目录,htaccess

htaccess - 重写具有同名目录的文件

如何为多个子目录制定htaccess重写规则

使用.htaccess重写具有多个参数的URL

如何从 htaccess 为多个 PHP 版本配置 Apache

使用多个参数重定向 URL 以清除 .htaccess 中的 URL