【问题标题】:PHP & .htaccess: prepend file for Multiple DirectoriesPHP & .htaccess:为多个目录添加文件
【发布时间】: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 根放入超全局而不用这种废话?

【问题讨论】:

    标签: php .htaccess prepend document-root


    【解决方案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 中执行一次。记得重启服务器。
    猜你喜欢
    • 2016-11-04
    • 2013-07-08
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多